GNU obstack function-pointer hijack
Tip
Leer en oefen AWS Hacking:
HackTricks Training AWS Red Team Expert (ARTE)
Leer en oefen GCP Hacking:HackTricks Training GCP Red Team Expert (GRTE)
Leer en oefen Azure Hacking:
HackTricks Training Azure Red Team Expert (AzRTE)
Ondersteun HackTricks
- Kyk na die subskripsie planne!
- Sluit aan by die 💬 Discord groep of die telegram groep of volg ons op Twitter 🐦 @hacktricks_live.
- Deel hacking truuks deur PRs in te dien na die HackTricks en HackTricks Cloud github repos.
Oorsig
GNU obstacks embed allocator state together with two indirect call targets:
chunkfun(offset+0x38) with signaturevoid *(*chunkfun)(void *, size_t)freefun(offset+0x40) with signaturevoid (*freefun)(void *, void *)extra_argand ause_extra_argflag kies of_obstack_newchunkchunkfun(new_size)ofchunkfun(extra_arg, new_size)aanroep
As ’n aanvaller ’n toepassing-beheerde struct obstack * of sy velde kan korrupteer, sal die volgende vergroting van die obstack (wanneer next_free == chunk_limit) ’n indirekte oproep deur chunkfun aktiveer, wat kode-uitvoeringsprimitiewe moontlik maak.
Primitief: size_t desync → 0-byte allocation → pointer OOB write
’n Algemene foutpatroon is om ’n 32-bit register te gebruik om sizeof(ptr) * count te bereken terwyl die logiese lengte in ’n 64-bit size_t gestoor word.
- Voorbeeld:
elements = obstack_alloc(obs, sizeof(void *) * size);word saamgestel asSHL EAX,0x3virsize << 3. - Met
size = 0x20000000ensizeof(void *) = 8, die vermenigvuldiging rol oor na0x0in 32-bit, so die pointer-array is 0 bytes, maar die geregistreerdesizebly0x20000000. - Daarna verrig
elements[curr++] = ptr;skrywes 8-byte OOB pointer stores in aangrensende heap-objekte, wat ’n beheerde cross-object overwrite-primitief gee.
Leaking libc via obstack.chunkfun
- Plaas twee heap-objekte langs mekaar (bv., twee stacks gebou met aparte obstacks).
- Gebruik die pointer-array OOB write van objek A om objek B se
elementspointer te oorskryf sodat ’npop/lees vanaf B ’n adres binne objek A se obstack dereferensieer. - Lees
chunkfun(mallocby default) by offset0x38om ’n libc-funksie-pointer te openbaar, bereken danlibc_base = leak - malloc_offseten herlei ander simbole (bv.,system,"/bin/sh").
Hijacking chunkfun with a fake obstack
Oorskryf ’n slagoffer se gestoor struct obstack * om na aanvaller-beheerde data te wys wat die obstack-header naboots. Minima-velde benodig:
next_free == chunk_limitom_obstack_newchunkop die volgende push te forceerchunkfun = system_addrextra_arg = binsh_addr,use_extra_arg = 1om die twee-argument vorm te kies
Aktiveer dan ’n toewysing op die slagoffer-obstack om system("/bin/sh") uit te voer via die indirekte oproep.
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
Aanvalresep
- Trigger size wrap om ’n 0-byte pointer array te skep met ’n enorme logiese lengte.
- Groom adjacency sodat ’n OOB pointer store ’n buurvoorwerp bereik wat ’n obstack pointer bevat.
- Leak libc deur ’n victim pointer te herlei na die buur obstack se
chunkfunen die function pointer te lees. - Forge obstack data met beheerde
chunkfun/extra_argen dwing_obstack_newchunkom in die vervalste header te beland, wat ’n function-pointer call van die attacker se keuse oplewer.
Verwysings
Tip
Leer en oefen AWS Hacking:
HackTricks Training AWS Red Team Expert (ARTE)
Leer en oefen GCP Hacking:HackTricks Training GCP Red Team Expert (GRTE)
Leer en oefen Azure Hacking:
HackTricks Training Azure Red Team Expert (AzRTE)
Ondersteun HackTricks
- Kyk na die subskripsie planne!
- Sluit aan by die 💬 Discord groep of die telegram groep of volg ons op Twitter 🐦 @hacktricks_live.
- Deel hacking truuks deur PRs in te dien na die HackTricks en HackTricks Cloud github repos.


