WWW2Exec - .dtors & .fini_array

Reading time: 3 minutes

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)

Soutenir HackTricks

.dtors

caution

De nos jours, il est très bizarre de trouver un binaire avec une section .dtors !

Les destructeurs sont des fonctions qui sont exécutées avant la fin du programme (après le retour de la fonction main).
Les adresses de ces fonctions sont stockées dans la section .dtors du binaire et donc, si vous parvenez à écrire l'adresse dans un shellcode dans __DTOR_END__, cela sera exécuté avant la fin des programmes.

Obtenez l'adresse de cette section avec :

bash
objdump -s -j .dtors /exec
rabin -s /exec | grep “__DTOR”

Vous trouverez généralement les marqueurs DTOR entre les valeurs ffffffff et 00000000. Donc, si vous voyez juste ces valeurs, cela signifie qu'il n'y a pas de fonction enregistrée. Donc, écrasez le 00000000 avec l'adresse du shellcode pour l'exécuter.

warning

Bien sûr, vous devez d'abord trouver un endroit pour stocker le shellcode afin de pouvoir l'appeler plus tard.

.fini_array

Essentiellement, il s'agit d'une structure avec des fonctions qui seront appelées avant que le programme ne se termine, comme .dtors. C'est intéressant si vous pouvez appeler votre shellcode simplement en sautant à une adresse, ou dans les cas où vous devez revenir à main à nouveau pour exploiter la vulnérabilité une deuxième fois.

bash
objdump -s -j .fini_array ./greeting

./greeting:     file format elf32-i386

Contents of section .fini_array:
8049934 a0850408

#Put your address in 0x8049934

Notez que lorsqu'une fonction de .fini_array est exécutée, elle passe à la suivante, donc elle ne sera pas exécutée plusieurs fois (prévenant les boucles éternelles), mais elle ne donnera également qu'une seule exécution de la fonction placée ici.

Notez que les entrées dans .fini_array sont appelées dans l'ordre inverse, donc vous voudrez probablement commencer à écrire à partir de la dernière.

Boucle éternelle

Pour abuser de .fini_array afin d'obtenir une boucle éternelle, vous pouvez vérifier ce qui a été fait ici: Si vous avez au moins 2 entrées dans .fini_array, vous pouvez :

  • Utiliser votre première écriture pour appeler à nouveau la fonction vulnérable d'écriture arbitraire
  • Ensuite, calculer l'adresse de retour dans la pile stockée par __libc_csu_fini (la fonction qui appelle toutes les fonctions de .fini_array) et y mettre l'adresse de __libc_csu_fini
  • Cela fera que __libc_csu_fini s'appellera à nouveau en exécutant les fonctions de .fini_array à nouveau, ce qui appellera la fonction WWW vulnérable 2 fois : une pour l'écriture arbitraire et une autre pour écraser à nouveau l'adresse de retour de __libc_csu_fini dans la pile pour s'appeler à nouveau.

caution

Notez qu'avec Full RELRO, la section .fini_array est rendue en lecture seule. Dans les versions plus récentes, même avec [Partial RELRO], la section .fini_array est également rendue en lecture seule.

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)

Soutenir HackTricks