1. 分析程序流程
2. 查看保護
3. 計算偏移
4.明確目標(biāo)(我們要組合的shellcode)
系統(tǒng)調(diào)用號,,即 eax 應(yīng)該為 0xb
第一個參數(shù),,即 ebx 應(yīng)該指向 /bin/sh 的地址,其實執(zhí)行 sh 的地址也可以,。
第二個參數(shù),,即 ecx 應(yīng)該為 0
第三個參數(shù),即 edx 應(yīng)該為 0
接下來我們就要一點點的去拼湊這些內(nèi)容,,我們沒法直接在棧里寫指令,,只能夠利用程序中自帶的指令去拼湊。
4. 將eax設(shè)置為0xb,,我們是沒法直接往棧里寫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的值了,。所以接下來我們要在程序中找一下有沒有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"
恰好也有我們所需要的,,只不過順序和我們的不同,,在組織payload時候需要調(diào)換下順序
6. ROPgadget --binary ./ret2syscall --string "/bin/sh"
7. ROPgadget --binary ./ret2syscall --only "int"
8. 編寫exp
9. 調(diào)試驗證