通過(guò)gdb調(diào)試,可以看到main函數(shù)調(diào)用一個(gè)函數(shù),這個(gè)函數(shù)內(nèi)調(diào)用兩次myRead進(jìn)行輸入字符串,
通過(guò)查看,可以看到輸入緩存區(qū)的地址,第一個(gè)輸入緩存區(qū)地址為0x804a060,是一個(gè)真實(shí)地址,

第二個(gè)緩存區(qū)是棧中的地址,

因?yàn)榈诙€(gè)緩存區(qū)是棧中的地址0xffffcfb0,方便進(jìn)行與ebp相減,0xffffcfd8-0xffffcfb0得出長(zhǎng)度為40個(gè)字節(jié)。也就是我們需要44個(gè)字節(jié)才可以把覆蓋到ebp,后面的4個(gè)字節(jié)是ret的地址。
然后需要開(kāi)始寫(xiě)shellcode,寫(xiě)shellcode的關(guān)鍵就是進(jìn)入到/bin/sh目錄下,需要用到函數(shù)execv,我是從網(wǎng)上找了一個(gè)最簡(jiǎn)單的shellcode修改了一下,編譯完測(cè)試是可以正常執(zhí)行的。


然后獲得這個(gè)shellcode的字節(jié)碼

最后需要把shellcode輸入,然后ret處寫(xiě)入shellcode的地址。我把shellcode作為第二次輸入,然后用a把剩下的字節(jié)補(bǔ)齊,再把第二個(gè)輸入緩存區(qū)的地址寫(xiě)在后面,“a”*19的原因是字節(jié)碼已經(jīng)占了25位,一共需要44位,所以剩下的19位用a填充

但是發(fā)現(xiàn)一直無(wú)法執(zhí)行,對(duì)進(jìn)程debug后,發(fā)現(xiàn)這個(gè)緩存區(qū)地址是無(wú)法訪(fǎng)問(wèn)的,

于是想改寫(xiě)shellcode把地址往棧外引,但是發(fā)現(xiàn)第一個(gè)緩存區(qū)地址是真實(shí)的地址,于是將shellcode在第一個(gè)緩存區(qū)寫(xiě)入,第二個(gè)緩存區(qū)進(jìn)行溢出,ret處的地址寫(xiě)第一個(gè)緩存區(qū)的地址,


于是可以成功拿到shell