Ret2dlresolve
Last updated
Last updated
Comme expliqué dans la page sur GOT/PLT et Relro, les binaires sans Full Relro résoudront les symboles (comme les adresses vers des bibliothèques externes) la première fois qu'ils sont utilisés. Cette résolution se produit en appelant la fonction _dl_runtime_resolve
.
La fonction _dl_runtime_resolve
récupère des références à partir de la pile vers certaines structures dont elle a besoin pour résoudre le symbole spécifié.
Par conséquent, il est possible de fausser toutes ces structures pour que la résolution dynamique des liens résolve le symbole demandé (comme la fonction system
) et l'appelle avec un paramètre configuré (par exemple system('/bin/sh')
).
Généralement, toutes ces structures sont falsifiées en créant une chaîne ROP initiale qui appelle read
sur une mémoire inscriptible, puis les structures et la chaîne '/bin/sh'
sont transmises pour qu'elles soient stockées par read dans un emplacement connu, puis la chaîne ROP continue en appelant _dl_runtime_resolve
avec l'adresse de $'/bin/sh'
.
Cette technique est particulièrement utile s'il n'y a pas de gadgets syscall (pour utiliser des techniques telles que ret2syscall ou SROP) et s'il n'y a pas de moyens de divulguer les adresses libc.
Vous pouvez trouver une meilleure explication sur cette technique dans la deuxième moitié de la vidéo :
Il est nécessaire de falsifier 3 structures : JMPREL
, STRTAB
et SYMTAB
. Vous trouverez une meilleure explication sur la construction de ces structures dans https://ir0nstone.gitbook.io/notes/types/stack/ret2dlresolve#structures
Écrire de fausses structures à un endroit
Définir le premier argument de system ($rdi = &'/bin/sh'
)
Définir sur la pile les adresses des structures pour appeler _dl_runtime_resolve
Appeler _dl_runtime_resolve
system
sera résolu et appelé avec '/bin/sh'
comme argument
Vous pouvez trouver un exemple de cette technique ici contenant une très bonne explication de la chaîne ROP finale, mais voici l'exploit final utilisé: