1. 分析程序流程
2. 查看保護(hù)
3. 計(jì)算偏移
4.明確目標(biāo)(我們要組合的shellcode)
系統(tǒng)調(diào)用號(hào),即 eax 應(yīng)該為 0xb
第一個(gè)參數(shù),即 ebx 應(yīng)該指向 /bin/sh 的地址,其實(shí)執(zhí)行 sh 的地址也可以。
第二個(gè)參數(shù),即 ecx 應(yīng)該為 0
第三個(gè)參數(shù),即 edx 應(yīng)該為 0
接下來(lái)我們就要一點(diǎn)點(diǎn)的去拼湊這些內(nèi)容,我們沒(méi)法直接在棧里寫指令,只能夠利用程序中自帶的指令去拼湊。
4. 將eax設(shè)置為0xb,我們是沒(méi)法直接往棧里寫mov eax,0xb的,那么還有另一種方式是pop eax,但是要保證棧頂必須是0xb。然后設(shè)置ebx,ecx,edx,同樣是這樣的道理,所以我們可以想象棧中的數(shù)據(jù)是:
pop eax;ret
0xb
pop ebx;pop ecx;pop edx;ret
"/bin/sh"的地址
0
0
int 0x80的地址
這樣我們就可以保證eax,ebx,ecx,edx的值了。所以接下來(lái)我們要在程序中找一下有沒(méi)有pop eax;和pop ebx;pop ecx;pop edx;的指令。
5. ROPgadget --binary ./ret2syscall --only "pop|ret" | grep "eax"
6.ROPgadget --binary ./ret2syscall --only "pop|ret" | grep "ebx" | grep "ecx" | grep "edx"
恰好也有我們所需要的,只不過(guò)順序和我們的不同,在組織payload時(shí)候需要調(diào)換下順序
6. ROPgadget --binary ./ret2syscall --string "/bin/sh"
7. ROPgadget --binary ./ret2syscall --only "int"
8. 編寫exp
9. 調(diào)試驗(yàn)證