GNU obstack function-pointer hijack
Tip
Apprenez et pratiquez le hacking AWS :
HackTricks Training AWS Red Team Expert (ARTE)
Apprenez et pratiquez le hacking GCP :HackTricks Training GCP Red Team Expert (GRTE)
Apprenez et pratiquez le hacking Azure :
HackTricks Training Azure Red Team Expert (AzRTE)
Soutenir HackTricks
- Vérifiez les plans d’abonnement !
- Rejoignez le 💬 groupe Discord ou le groupe telegram ou suivez-nous sur Twitter 🐦 @hacktricks_live.
- Partagez des astuces de hacking en soumettant des PR au HackTricks et HackTricks Cloud dépôts github.
Aperçu
GNU obstacks embarquent l’état de l’allocateur ainsi que deux cibles d’appel indirect :
chunkfun(offset+0x38) with signaturevoid *(*chunkfun)(void *, size_t)freefun(offset+0x40) with signaturevoid (*freefun)(void *, void *)extra_argand ause_extra_argflag select whether_obstack_newchunkcallschunkfun(new_size)orchunkfun(extra_arg, new_size)
Si un attaquant peut corrompre un struct obstack * appartenant à l’application ou ses champs, la prochaine croissance de l’obstack (lorsque next_free == chunk_limit) déclenche un appel indirect via chunkfun, permettant des primitives d’exécution de code.
Primitive : size_t desync → allocation de 0 octet → écriture OOB de pointeur
Un motif de bug courant est d’utiliser un registre 32 bits pour calculer sizeof(ptr) * count tout en stockant la longueur logique dans un size_t 64 bits.
- Exemple :
elements = obstack_alloc(obs, sizeof(void *) * size);is compiled asSHL EAX,0x3forsize << 3. - Avec
size = 0x20000000etsizeof(void *) = 8, la multiplication déborde à0x0en 32 bits, donc le tableau de pointeurs fait 0 octets, mais lesizeenregistré reste0x20000000. - Les écritures suivantes
elements[curr++] = ptr;effectuent des stockages de pointeur OOB de 8 octets dans des objets heap adjacents, fournissant une primitive d’écrasement contrôlé inter-objets.
Leaking libc via obstack.chunkfun
- Placez deux objets heap adjacents (par ex., deux stacks construits avec des obstacks séparés).
- Utilisez l’écriture OOB du tableau de pointeurs de l’objet A pour écraser le pointeur
elementsde l’objet B de sorte qu’unpop/read depuis B déréférence une adresse à l’intérieur de l’obstack de A. - Lisez
chunkfun(mallocpar défaut) à l’offset0x38pour révéler un pointeur de fonction libc, puis calculezlibc_base = leak - malloc_offsetet déduisez d’autres symboles (par ex.,system,"/bin/sh").
Hijacking chunkfun with a fake obstack
Écrasez le struct obstack * stocké de la victime pour qu’il pointe vers des données contrôlées par l’attaquant qui imitent l’en-tête de l’obstack. Champs minimaux nécessaires :
next_free == chunk_limitpour forcer_obstack_newchunkau prochain pushchunkfun = system_addrextra_arg = binsh_addr,use_extra_arg = 1pour sélectionner la forme d’appel à deux arguments
Puis déclenchez une allocation sur l’obstack de la victime pour exécuter system("/bin/sh") via l’appel indirect.
Exemple de layout d’obstack factice (offsets 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
Recette d’attaque
- Trigger size wrap pour créer un 0-byte pointer array avec une énorme longueur logique.
- Groom adjacency pour qu’un OOB pointer store atteigne un objet voisin contenant un obstack pointer.
- Leak libc en redirigeant un victim pointer vers le
chunkfunde l’obstack voisin et en lisant le function pointer. - Forge obstack des données avec
chunkfun/extra_argcontrôlés et forcer_obstack_newchunkà atterrir dans l’en-tête falsifié, produisant un appel de function-pointer au choix de l’attaquant.
Références
Tip
Apprenez et pratiquez le hacking AWS :
HackTricks Training AWS Red Team Expert (ARTE)
Apprenez et pratiquez le hacking GCP :HackTricks Training GCP Red Team Expert (GRTE)
Apprenez et pratiquez le hacking Azure :
HackTricks Training Azure Red Team Expert (AzRTE)
Soutenir HackTricks
- Vérifiez les plans d’abonnement !
- Rejoignez le 💬 groupe Discord ou le groupe telegram ou suivez-nous sur Twitter 🐦 @hacktricks_live.
- Partagez des astuces de hacking en soumettant des PR au HackTricks et HackTricks Cloud dépôts github.


