WWW2Exec - __malloc_hook & __free_hook

Reading time: 4 minutes

tip

Lernen & üben Sie AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Lernen & üben Sie GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)

Unterstützen Sie HackTricks

Malloc Hook

Wie auf der offiziellen GNU-Seite beschrieben, ist die Variable __malloc_hook ein Zeiger, der auf die Adresse einer Funktion zeigt, die aufgerufen wird, wann immer malloc() aufgerufen wird, die im Datensegment der libc-Bibliothek gespeichert ist. Daher, wenn diese Adresse mit einem One Gadget überschrieben wird und malloc aufgerufen wird, wird der One Gadget aufgerufen.

Um malloc aufzurufen, ist es möglich, darauf zu warten, dass das Programm es aufruft, oder indem man printf("%10000$c") aufruft, was zu viele Bytes allokiert, sodass libc malloc aufruft, um sie im Heap zu allokieren.

Weitere Informationen zu One Gadget finden Sie in:

One Gadget

warning

Beachten Sie, dass Hooks für GLIBC >= 2.34 deaktiviert sind. Es gibt andere Techniken, die in modernen GLIBC-Versionen verwendet werden können. Siehe: https://github.com/nobodyisnobody/docs/blob/main/code.execution.on.last.libc/README.md.

Free Hook

Dies wurde in einem der Beispiele auf der Seite missbraucht, die einen Fast Bin-Angriff nach einem Unsorted Bin-Angriff missbraucht hat:

Unsorted Bin Attack

Es ist möglich, die Adresse von __free_hook zu finden, wenn die Binärdatei Symbole hat, mit dem folgenden Befehl:

bash
gef➤  p &__free_hook

In dem Beitrag finden Sie eine Schritt-für-Schritt-Anleitung, wie Sie die Adresse des free Hooks ohne Symbole lokalisieren können. Zusammenfassend lässt sich sagen, dass in der free-Funktion:

gef➤  x/20i free
0xf75dedc0 <free>: push   ebx
0xf75dedc1 <free+1>: call   0xf768f625
0xf75dedc6 <free+6>: add    ebx,0x14323a
0xf75dedcc <free+12>:  sub    esp,0x8
0xf75dedcf <free+15>:  mov    eax,DWORD PTR [ebx-0x98]
0xf75dedd5 <free+21>:  mov    ecx,DWORD PTR [esp+0x10]
0xf75dedd9 <free+25>:  mov    eax,DWORD PTR [eax]--- BREAK HERE
0xf75deddb <free+27>:  test   eax,eax ;<
0xf75deddd <free+29>:  jne    0xf75dee50 <free+144>

An der genannten Breakpoint-Stelle im vorherigen Code wird sich die Adresse des free Hooks in $eax befinden.

Jetzt wird ein fast bin attack durchgeführt:

  • Zunächst wird entdeckt, dass es möglich ist, mit schnellen Chunks der Größe 200 im __free_hook-Bereich zu arbeiten:
  • gef➤  p &__free_hook
    

$1 = (void (**)(void *, const void *)) 0x7ff1e9e607a8 <__free_hook> gef➤ x/60gx 0x7ff1e9e607a8 - 0x59 0x7ff1e9e6074f: 0x0000000000000000 0x0000000000000200 0x7ff1e9e6075f: 0x0000000000000000 0x0000000000000000 0x7ff1e9e6076f <list_all_lock+15>: 0x0000000000000000 0x0000000000000000 0x7ff1e9e6077f <_IO_stdfile_2_lock+15>: 0x0000000000000000 0x0000000000000000

  • Wenn es gelingt, einen schnellen Chunk der Größe 0x200 an dieser Stelle zu erhalten, wird es möglich sein, einen Funktionszeiger zu überschreiben, der ausgeführt wird.
  • Dazu wird ein neuer Chunk der Größe 0xfc erstellt und die zusammengeführte Funktion wird mit diesem Zeiger zweimal aufgerufen, sodass wir einen Zeiger auf einen freigegebenen Chunk der Größe 0xfc*2 = 0x1f8 im fast bin erhalten.
  • Dann wird die Edit-Funktion in diesem Chunk aufgerufen, um die fd-Adresse dieses fast bins so zu ändern, dass sie auf die vorherige __free_hook-Funktion zeigt.
  • Anschließend wird ein Chunk der Größe 0x1f8 erstellt, um den vorherigen nutzlosen Chunk aus dem fast bin abzurufen, sodass ein weiterer Chunk der Größe 0x1f8 erstellt wird, um einen fast bin Chunk im __free_hook zu erhalten, der mit der Adresse der system-Funktion überschrieben wird.
  • Und schließlich wird ein Chunk, das die Zeichenkette /bin/sh\x00 enthält, freigegeben, indem die Delete-Funktion aufgerufen wird, wodurch die __free_hook-Funktion ausgelöst wird, die auf system mit /bin/sh\x00 als Parameter zeigt.

Referenzen

tip

Lernen & üben Sie AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Lernen & üben Sie GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)

Unterstützen Sie HackTricks