Ret2plt
Informations de base
L'objectif de cette technique serait de dévoiler une adresse d'une fonction du PLT pour contourner l'ASLR. Cela est possible car, par exemple, si vous dévoilez l'adresse de la fonction puts
de la libc, vous pouvez ensuite calculer où se trouve la base de libc
et calculer des décalages pour accéder à d'autres fonctions telles que system
.
Cela peut être fait avec une charge utile pwntools
comme (à partir d'ici):
Notez comment puts
(en utilisant l'adresse du PLT) est appelé avec l'adresse de puts
située dans le GOT
. Cela est dû au fait qu'au moment où puts
imprime l'entrée GOT
de puts, cette entrée contiendra l'adresse de puts
en mémoire.
Notez également comment l'adresse de main
est utilisée dans l'exploit afin que lorsque puts
termine son exécution, le binaire rappelle main
au lieu de se terminer (ainsi, l'adresse divulguée restera valide).
Notez que pour que cela fonctionne, le binaire ne doit pas être compilé avec PIE ou vous devez avoir trouvé une fuite pour contourner PIE afin de connaître l'adresse du PLT
, GOT
et main
.
Vous pouvez trouver un exemple complet de ce contournement ici. C'était l'exploit final de cet exemple:
Autres exemples et Références
64 bits, ASLR activé mais pas de PIE, la première étape consiste à remplir un dépassement de tampon jusqu'au byte 0x00 du canary pour ensuite appeler puts et le divulguer. Avec le canary, un gadget ROP est créé pour appeler puts afin de divulguer l'adresse de puts depuis la GOT, puis un gadget ROP pour appeler
system('/bin/sh')
.64 bits, ASLR activé, pas de canary, dépassement de pile dans main à partir d'une fonction enfant. Gadget ROP pour appeler puts afin de divulguer l'adresse de puts depuis la GOT, puis appeler un gadget one.
Last updated