GNU obstack function-pointer hijack
Tip
Вивчайте та практикуйте AWS Hacking:
HackTricks Training AWS Red Team Expert (ARTE)
Вивчайте та практикуйте GCP Hacking:HackTricks Training GCP Red Team Expert (GRTE)
Вивчайте та практикуйте Azure Hacking:
HackTricks Training Azure Red Team Expert (AzRTE)
Підтримайте HackTricks
- Перевірте плани підписки!
- Приєднуйтесь до 💬 групи Discord або групи telegram або слідкуйте за нами в Twitter 🐦 @hacktricks_live.
- Діліться хакерськими трюками, надсилаючи PR до HackTricks та HackTricks Cloud репозиторіїв на github.
Огляд
GNU obstacks вбудовують стан аллокатора разом із двома непрямими цілями виклику:
chunkfun(offset+0x38) із сигнатуроюvoid *(*chunkfun)(void *, size_t)freefun(offset+0x40) із сигнатуроюvoid (*freefun)(void *, void *)extra_argта прапорецьuse_extra_argобирають, чи викликає_obstack_newchunkchunkfun(new_size)чиchunkfun(extra_arg, new_size)
Якщо атакувальник може пошкодити struct obstack *, що належить застосунку, або його поля, наступне розширення obstack (коли next_free == chunk_limit) викликає непрямий виклик через chunkfun, що дозволяє примітиви виконання коду.
Primitive: size_t desync → 0-byte allocation → pointer OOB write
Поширений шаблон багу — використання 32-бітного регістра для обчислення sizeof(ptr) * count, тоді як логічна довжина зберігається в 64-бітному size_t.
- Приклад:
elements = obstack_alloc(obs, sizeof(void *) * size);компілюється якSHL EAX,0x3дляsize << 3. - При
size = 0x20000000таsizeof(void *) = 8множення обертається до0x0у 32-бітному контексті, тому масив вказівників має 0 байт, але задокументованеsizeзалишається0x20000000. - Подальші
elements[curr++] = ptr;записи виконують 8-байтові OOB запису вказівників в суміжні heap-об’єкти, даючи керований примітив перезапису між об’єктами.
Leaking libc via obstack.chunkfun
- Place two heap objects adjacent (e.g., two stacks built with separate obstacks).
- Use the pointer-array OOB write from object A to overwrite object B’s
elementspointer so that apop/read from B dereferences an address inside object A’s obstack. - Read
chunkfun(mallocby default) at offset0x38to disclose a libc function pointer, then computelibc_base = leak - malloc_offsetand derive other symbols (e.g.,system,"/bin/sh").
Hijacking chunkfun with a fake obstack
Overwrite a victim’s stored struct obstack * to point at attacker-controlled data that mimics the obstack header. Minimal fields needed:
next_free == chunk_limitto force_obstack_newchunkon next pushchunkfun = system_addrextra_arg = binsh_addr,use_extra_arg = 1to select the two-argument call form
Then trigger an allocation on the victim obstack to execute system("/bin/sh") through the indirect call.
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 на
chunkfunсусіднього obstack і прочитавши function pointer. - Forge obstack дані з контрольованими
chunkfun/extra_argі змусити_obstack_newchunkопинитися в підробленому заголовку, що призведе до виклику function-pointer за вибором атакуючого.
Посилання
Tip
Вивчайте та практикуйте AWS Hacking:
HackTricks Training AWS Red Team Expert (ARTE)
Вивчайте та практикуйте GCP Hacking:HackTricks Training GCP Red Team Expert (GRTE)
Вивчайте та практикуйте Azure Hacking:
HackTricks Training Azure Red Team Expert (AzRTE)
Підтримайте HackTricks
- Перевірте плани підписки!
- Приєднуйтесь до 💬 групи Discord або групи telegram або слідкуйте за нами в Twitter 🐦 @hacktricks_live.
- Діліться хакерськими трюками, надсилаючи PR до HackTricks та HackTricks Cloud репозиторіїв на github.


