BugkuCTF-PWN题pwn2-overflow超详细讲解
解題思路
1)計算出get_shell_的地址偏移量
2)算出來之后就直接溢出到后門函數
知識點
x64函數調用規則
解題之前我們先學下linux x64的函數調用規則。
x64機器在調用某個函數前,比如int func(int a, int b, int c, int d, int e, int f, int g, int h),首先他會把前6個參數從左往右存入到寄存器rdi、rsi、rdx、rcx、r8、r9,其余參數存入到棧里,保存的順序是從右往左入棧。比如abcdef會存入到寄存器里,然后一次入棧h、g。
保存完參數之后再把函數后面一條指令的地址入棧保存。
棧結構
上圖就是一個函數的棧結構,上面是棧頂,下面是棧底,棧頂是低地址,棧底是高地址,read函數往棧里寫數據是從棧頂往棧底寫入
棧頂指針(寄存器):rsp
棧底指針(幀指針):rbp
C語言知識點
memset
memset:可以方便的清空某個結構類型的變量或數組,作用是在一段內存塊里填充某個給定的值,它是對較大的結構體或數組進行清零操作的一類最快方法,為string.h頭文件里的函數,按字節對內存塊進行初始操作
例:memset(buffer, 0, sizeof(buffer)) 給buffer清出一個sizeof(buffer)大小的空間,填充0,做數組初始操作工作。
setvbuf
為什么要使用setvbuf函數
如果你的內存足夠大,可以把文件IO的BUF設置大一些,這樣每次你用
fopen/fread/fwrite/fscanf/fprintf語句的時候,都會在內存里操作,減少內存到磁盤IO讀寫的操作次數,提高系統效率。
如果你的程序的功能涉及到類似數據庫、視頻、音頻、圖像處理等大量需要爆發式磁盤到內存的IO情況下,可以考慮setvbuf進行優化內存IO。
功 能: 把緩區與流相關
puts()
puts()函數用來向標準輸出設備屏幕輸出字符串并換行。
具體是把字符串輸出到屏幕上,將‘\0’轉換為回車換行。調用方式是:puts(str)。其里str是字符串數組名或者字符串指針。實際上,數組名就是指針。
puts() 輸出更簡潔、更方便。而且使用 puts() 函數連換行符 ‘\n’ 都省了,使用 puts() 顯示字符串時,系統會自動在其后添加一個換行符,也就是說
printf("%s\n", name);和:puts(name)是等價的
read():
函數原型: int read(int fd,void *buf,int len);
功能:用于讀取打開文件的內容
參數:int fd 為要讀取的文件
void *buf 為要將讀取的內容保存的緩沖區
int len 讀取文件的長度
返回值:返回實際讀取的字節數
read(0,&s,0x100uLL):讀取s這個變量0x100個字節,即從外部讀取0x100的數據到s里
解題流程
0、在Linux里打開文件,使用file命令查看文件類型
64位文件
checksec檢查保護情況
未開啟任何保護,嘗試運行一下
1、使用IDA 64 Pro打開文件
查看主函數
通過觀察這個程序的邏輯我們發現s這個變量申請了0x30個字節,但是下面read函數讀取了s這個變量0x100個字節,所以存在棧溢出。
然后發現在main函數下面有一個get_shell_函數,雙擊下去發現這個函數的地址是0x400751,先把這個地址記下來。
下面就是在gdb里打開pwn2,然后創建隨機字符,并運行。
發現RBP段的字符被填充為bAA1AAGA,再利用這個字符計算出偏移量。
然后根據偏移量寫出腳本就可以了
運行
得到flag{99kls08s6d5a73bcd}
總結
以上是生活随笔為你收集整理的BugkuCTF-PWN题pwn2-overflow超详细讲解的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 打印三角形之细节讲解
- 下一篇: html之引入独立js方便维护jq代码