GNU obstack function-pointer hijack
Tip
Impara e pratica il hacking AWS:
HackTricks Training AWS Red Team Expert (ARTE)
Impara e pratica il hacking GCP:HackTricks Training GCP Red Team Expert (GRTE)
Impara e pratica il hacking Azure:
HackTricks Training Azure Red Team Expert (AzRTE)
Supporta HackTricks
- Controlla i piani di abbonamento!
- Unisciti al 💬 gruppo Discord o al gruppo telegram o seguici su Twitter 🐦 @hacktricks_live.
- Condividi trucchi di hacking inviando PR ai HackTricks e HackTricks Cloud repos github.
Panoramica
GNU obstacks incorporano lo stato dell’allocatore insieme a due target di chiamata indiretta:
chunkfun(offset+0x38) con la firmavoid *(*chunkfun)(void *, size_t)freefun(offset+0x40) con la firmavoid (*freefun)(void *, void *)extra_arge un flaguse_extra_argselezionano se_obstack_newchunkchiamachunkfun(new_size)oppurechunkfun(extra_arg, new_size)
Se un attacker può corrompere un struct obstack * posseduto dall’applicazione o i suoi campi, la successiva espansione dell’obstack (quando next_free == chunk_limit) attiva una chiamata indiretta tramite chunkfun, abilitando primitive di esecuzione di codice.
Primitive: size_t desync → 0-byte allocation → pointer OOB write
Un pattern di bug comune è usare un registro a 32 bit per calcolare sizeof(ptr) * count mentre la lunghezza logica viene memorizzata in un size_t a 64 bit.
- Esempio:
elements = obstack_alloc(obs, sizeof(void *) * size);viene compilato comeSHL EAX,0x3persize << 3. - Con
size = 0x20000000esizeof(void *) = 8, la moltiplicazione va in wrap su 32 bit a0x0, quindi l’array di puntatori è 0 bytes, ma lasizeregistrata rimane0x20000000. - Successive scritture
elements[curr++] = ptr;effettuano store di puntatori OOB da 8 byte in oggetti heap adiacenti, fornendo una primitive di overwrite cross-object controllata.
Leaking libc via obstack.chunkfun
- Posiziona due oggetti heap adiacenti (es. due stack costruiti con obstacks separati).
- Usa il pointer-array OOB write dall’oggetto A per sovrascrivere il puntatore
elementsdell’oggetto B in modo che unpop/read da B dereferenzi un indirizzo all’interno dell’obstack di A. - Leggi
chunkfun(mallocdi default) all’offset0x38per ottenere un puntatore a funzione libc, quindi calcolalibc_base = leak - malloc_offsete deriva altri simboli (es.system,"/bin/sh").
Dirottamento di chunkfun con un fake obstack
Sovrascrivi il struct obstack * della vittima per puntare a dati controllati dall’attacker che imitano l’header dell’obstack. Campi minimi necessari:
next_free == chunk_limitper forzare_obstack_newchunkalla prossima pushchunkfun = system_addrextra_arg = binsh_addr,use_extra_arg = 1per selezionare la forma di chiamata a due argomenti
Poi triggera un’allocazione sull’obstack della vittima per eseguire system("/bin/sh") tramite la chiamata indiretta.
Esempio di layout di fake obstack (offset glibc 2.42):
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
Ricetta d’attacco
- Trigger size wrap per creare un array di puntatori di 0 byte con una lunghezza logica enorme.
- Groom adjacency in modo che un OOB pointer store raggiunga un neighbor object contenente un obstack pointer.
- Leak libc reindirizzando un victim pointer al
chunkfundel neighbor obstack e leggendo il function pointer. - Forge obstack dati con
chunkfun/extra_argcontrollati e forzare_obstack_newchunka finire nell’header falsificato, producendo una chiamata a function-pointer a scelta dell’attacker.
Riferimenti
Tip
Impara e pratica il hacking AWS:
HackTricks Training AWS Red Team Expert (ARTE)
Impara e pratica il hacking GCP:HackTricks Training GCP Red Team Expert (GRTE)
Impara e pratica il hacking Azure:
HackTricks Training Azure Red Team Expert (AzRTE)
Supporta HackTricks
- Controlla i piani di abbonamento!
- Unisciti al 💬 gruppo Discord o al gruppo telegram o seguici su Twitter 🐦 @hacktricks_live.
- Condividi trucchi di hacking inviando PR ai HackTricks e HackTricks Cloud repos github.


