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.
- Μοιραστείτε κόλπα hacking υποβάλλοντας PRs στα HackTricks και HackTricks Cloud github repos.
Overview
Τα GNU obstacks ενσωματώνουν την κατάσταση του allocator μαζί με δύο στόχους έμμεσης κλήσης:
chunkfun(offset+0x38) με υπογραφήvoid *(*chunkfun)(void *, size_t)freefun(offset+0x40) με υπογραφήvoid (*freefun)(void *, void *)- Το
extra_argκαι ένα flaguse_extra_argεπιλέγουν αν το_obstack_newchunkκαλείchunkfun(new_size)ήchunkfun(extra_arg, new_size)
Εάν ένας επιτιθέμενος μπορεί να αλλοιώσει ένα struct obstack * που ανήκει στην εφαρμογή ή τα πεδία του, η επόμενη επέκταση του obstack (όταν next_free == chunk_limit) ενεργοποιεί μια έμμεση κλήση μέσω του chunkfun, επιτρέποντας primitives εκτέλεσης κώδικα.
Primitive: size_t desync → 0-byte allocation → pointer OOB write
Ένα συνηθισμένο μοτίβο σφάλματος είναι η χρήση ενός 32-bit register για τον υπολογισμό sizeof(ptr) * count ενώ το λογικό μήκος αποθηκεύεται σε 64-bit size_t.
- Παράδειγμα:
elements = obstack_alloc(obs, sizeof(void *) * size);μεταγλωττίζεται ωςSHL EAX,0x3γιαsize << 3. - Με
size = 0x20000000καιsizeof(void *) = 8, ο πολλαπλασιασμός περιτυλίγεται σε0x0σε 32-bit, οπότε ο πίνακας δεικτών είναι 0 bytes, αλλά το καταγεγραμμένοsizeπαραμένει0x20000000. - Τα επακόλουθα
elements[curr++] = ptr;εκτελούν 8-byte OOB pointer stores σε γειτονικά heap objects, παρέχοντας primitive για ελεγχόμενο cross-object overwrite.
Leaking libc via obstack.chunkfun
- Τοποθετήστε δύο heap objects γείτονες (π.χ. δύο stacks φτιαγμένα με ξεχωριστά obstacks).
- Χρησιμοποιήστε το pointer-array OOB write από το object A για να αντικαταστήσετε τον pointer
elementsτου object B έτσι ώστε έναpop/read από το B να κάνει dereference μια διεύθυνση μέσα στο obstack του A. - Διαβάστε το
chunkfun(mallocby default) στο offset0x38για να αποκαλύψετε έναν δείκτη συνάρτησης της libc, στη συνέχεια υπολογίστεlibc_base = leak - malloc_offsetκαι εξαχθούν άλλα σύμβολα (π.χ.system,"/bin/sh").
Hijacking chunkfun with a fake obstack
Αντικαταστήστε το αποθηκευμένο struct obstack * του θύματος ώστε να δείχνει σε δεδομένα υπό έλεγχο του επιτιθέμενου που μιμούνται το header του obstack. Τα ελάχιστα απαιτούμενα πεδία:
next_free == chunk_limitγια να αναγκαστεί το_obstack_newchunkστην επόμενη pushchunkfun = system_addrextra_arg = binsh_addr,use_extra_arg = 1για να επιλεγεί η μορφή κλήσης με δύο ορίσματα
Στη συνέχεια ενεργοποιήστε μια allocation στο 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 στο
chunkfunτου γειτονικού obstack και διαβάζοντας τον function pointer. - Forge obstack δεδομένα με ελεγχόμενο
chunkfun/extra_argκαι εξαναγκάζοντας το_obstack_newchunkνα προσγειωθεί στην πλαστή κεφαλίδα, αποφέροντας μια κλήση function-pointer της επιλογής του attacker.
Αναφορές
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.
- Μοιραστείτε κόλπα hacking υποβάλλοντας PRs στα HackTricks και HackTricks Cloud github repos.


