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
- 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 PRs au HackTricks et HackTricks Cloud dépôts github.
.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 :
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.
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
- 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 PRs au HackTricks et HackTricks Cloud dépôts github.