GNU obstack function-pointer hijack
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์ ์ ์ถํ์ฌ ํดํน ํธ๋ฆญ์ ๊ณต์ ํ์ธ์.
๊ฐ์
GNU obstacks๋ ํ ๋น์ ์ํ๋ฅผ ๋ ๊ฐ์ ๊ฐ์ ํธ์ถ ๋์๊ณผ ํจ๊ป ํฌํจํฉ๋๋ค:
chunkfun(offset+0x38) with signaturevoid *(*chunkfun)(void *, size_t)freefun(offset+0x40) with signaturevoid (*freefun)(void *, void *)extra_arg์use_extra_argํ๋๊ทธ๋_obstack_newchunk๊ฐchunkfun(new_size)๋๋chunkfun(extra_arg, new_size)์ค ์ด๋ค ํํ๋ก ํธ์ถ๋ ์ง ์ ํํฉ๋๋ค
๊ณต๊ฒฉ์๊ฐ ์ ํ๋ฆฌ์ผ์ด์
์์ ์ struct obstack * ๋๋ ๊ทธ ํ๋๋ฅผ ์์์ํฌ ์ ์๋ค๋ฉด, obstack์ด ๋ค์ ๋ฒ ํ์ฅ๋ ๋(next_free == chunk_limit), chunkfun์ ํตํ ๊ฐ์ ํธ์ถ์ด ๋ฐ์ํ์ฌ ์ฝ๋ ์คํ ํ๋ฆฌ๋ฏธํฐ๋ธ๋ฅผ ๊ฐ๋ฅํ๊ฒ ํฉ๋๋ค.
Primitive: size_t ๋ถ์ผ์น โ 0-๋ฐ์ดํธ ํ ๋น โ ํฌ์ธํฐ OOB ์ฐ๊ธฐ
์ผ๋ฐ์ ์ธ ๋ฒ๊ทธ ํจํด์ 32-bit register๋ฅผ ์ฌ์ฉํด sizeof(ptr) * count๋ฅผ ๊ณ์ฐํ๋ ๋ฐ๋ฉด ๋
ผ๋ฆฌ์ ๊ธธ์ด๋ 64-bit size_t์ ์ ์ฅํ๋ ๊ฒ์
๋๋ค.
- Example:
elements = obstack_alloc(obs, sizeof(void *) * size);is compiled asSHL EAX,0x3forsize << 3. size = 0x20000000๋ฐsizeof(void *) = 8์ผ ๋, 32-bit์์ ๊ณฑ์ ์ด0x0์ผ๋ก ๋ํ๋์ด ํฌ์ธํฐ ๋ฐฐ์ด์ด 0 ๋ฐ์ดํธ๊ฐ ๋์ง๋ง, ๊ธฐ๋ก๋size๋ ์ฌ์ ํ0x20000000์ ๋๋ค.- ์ดํ
elements[curr++] = ptr;์ฐ๊ธฐ๋ ์ธ์ ํ ํ ๊ฐ์ฒด๋ค์ 8-๋ฐ์ดํธ OOB ํฌ์ธํฐ ์ ์ฅ์ ์ํํ์ฌ ์ ์ด ๊ฐ๋ฅํ ๊ฐ์ฒด ๊ฐ ๋ฎ์ด์ฐ๊ธฐ ํ๋ฆฌ๋ฏธํฐ๋ธ๋ฅผ ์ ๊ณตํฉ๋๋ค.
Leaking libc via obstack.chunkfun
- ๋ ํ ๊ฐ์ฒด๋ฅผ ์ธ์ ํ๊ฒ ๋ฐฐ์นํฉ๋๋ค(์: ๋ณ๊ฐ์ obstacks๋ก ๊ตฌ์ฑ๋ ๋ ์คํ).
- ๊ฐ์ฒด A์ ํฌ์ธํฐ ๋ฐฐ์ด OOB ์ฐ๊ธฐ๋ฅผ ์ฌ์ฉํด ๊ฐ์ฒด B์
elementsํฌ์ธํฐ๋ฅผ ๋ฎ์ด์จ์, B์์์pop/read๊ฐ ๊ฐ์ฒด A์ obstack ๋ด๋ถ ์ฃผ์๋ฅผ ์ญ์ฐธ์กฐํ๋๋ก ๋ง๋ญ๋๋ค. - ์คํ์
0x38์์chunkfun(malloc์ด ๊ธฐ๋ณธ๊ฐ)์ ์ฝ์ด libc ํจ์ ํฌ์ธํฐ๋ฅผ ๋ ธ์ถ์ํค๊ณ , ๊ทธ ๋ค์libc_base = leak - malloc_offset์ ๊ณ์ฐํ์ฌ ๋ค๋ฅธ ์ฌ๋ณผ(์:system,"/bin/sh")์ ์ ๋ํฉ๋๋ค.
Hijacking chunkfun with a fake obstack
ํผํด์์ ์ ์ฅ๋ struct obstack *์ ๋ฎ์ด์จ์ obstack ํค๋๋ฅผ ํ๋ด๋ธ ๊ณต๊ฒฉ์๊ฐ ์ ์ดํ๋ ๋ฐ์ดํฐ๋ก ๊ฐ๋ฆฌํค๊ฒ ๋ง๋ญ๋๋ค. ์ต์ํ ํ์ํ ํ๋:
next_free == chunk_limitโ ๋ค์ push์์_obstack_newchunk๋ฅผ ๊ฐ์ ํ๊ธฐ ์ํดchunkfun = system_addrextra_arg = binsh_addr,use_extra_arg = 1โ ๋-์ธ์ ํธ์ถ ํํ ์ ํ
๊ทธ๋ฐ ๋ค์ ํผํด์ obstack์์ ํ ๋น์ ํธ๋ฆฌ๊ฑฐํ์ฌ ๊ฐ์ ํธ์ถ์ ํตํด system("/bin/sh")์ ์คํํฉ๋๋ค.
Example fake obstack layout (glibc 2.42 offsets):
fake = b""
fake += p64(0x1000) # chunk_size
fake += p64(heap_leak) # chunk
fake += p64(heap_leak) # object_base
fake += p64(heap_leak) # next_free == chunk_limit
fake += p64(heap_leak) # chunk_limit
fake += p64(0xF) # alignment_mask
fake += p64(0) # temp
fake += p64(system_addr) # chunkfun
fake += p64(0) # freefun
fake += p64(binsh_addr) # extra_arg
fake += p64(1) # use_extra_arg flag set
๊ณต๊ฒฉ ์ ์ฐจ
- Trigger size wrap๋ก ๊ฑฐ๋ํ ๋ ผ๋ฆฌ์ ๊ธธ์ด๋ฅผ ๊ฐ์ง 0-byte pointer array๋ฅผ ์์ฑํฉ๋๋ค.
- Groom adjacencyํ์ฌ OOB pointer store๊ฐ obstack pointer๋ฅผ ํฌํจํ๋ ์ธ์ ๊ฐ์ฒด์ ๋๋ฌํ๋๋ก ์กฐ์ํฉ๋๋ค.
- Leak libc โ victim pointer๋ฅผ neighbor obstack์
chunkfun์ผ๋ก ๋ฆฌ๋ค์ด๋ ํธํ๊ณ function pointer๋ฅผ ์ฝ์ต๋๋ค. - Forge obstack ๋ฐ์ดํฐ์ ์ ์ด๋
chunkfun/extra_arg๋ฅผ ๋ฃ๊ณ_obstack_newchunk๊ฐ ์์กฐ๋ ํค๋์ ์ค๋๋ก ๊ฐ์ ํ์ฌ ๊ณต๊ฒฉ์๊ฐ ์ ํํ function-pointer ํธ์ถ์ ๋ฐ์์ํต๋๋ค.
References
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์ ์ ์ถํ์ฌ ํดํน ํธ๋ฆญ์ ๊ณต์ ํ์ธ์.


