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