WWW2Exec - __malloc_hook & __free_hook
Last updated
Last updated
Lernen Sie & üben Sie AWS-Hacking:HackTricks Training AWS Red Team Expert (ARTE) Lernen Sie & üben Sie GCP-Hacking: HackTricks Training GCP Red Team Expert (GRTE)
Wie auf der Offiziellen GNU-Website erwähnt, ist die Variable __malloc_hook
ein Zeiger, der auf die Adresse einer Funktion zeigt, die aufgerufen wird, wenn malloc()
aufgerufen wird, gespeichert im Datensegment der libc-Bibliothek. 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, auf den Programmaufruf zu warten oder durch Aufruf von printf("%10000$c")
, der zu viele Bytes zuweist und libc
dazu bringt, sie im Heap zu allozieren.
Weitere Informationen zu One Gadget finden Sie unter:
One GadgetBeachten Sie, dass Hooks für GLIBC >= 2.34 deaktiviert sind. Es gibt andere Techniken, die bei modernen GLIBC-Versionen verwendet werden können. Siehe: https://github.com/nobodyisnobody/docs/blob/main/code.execution.on.last.libc/README.md.
Dies wurde in einem der Beispiele auf der Seite missbraucht, indem ein Fast-Bin-Angriff nach einem unsortierten Bin-Angriff missbraucht wurde:
Unsorted Bin AttackEs ist möglich, die Adresse von __free_hook
zu finden, wenn die Binärdatei Symbole hat, mit dem folgenden Befehl:
Im Beitrag finden Sie eine schrittweise Anleitung, wie Sie die Adresse des free Hooks ohne Symbole lokalisieren können. Zusammenfassend, in der free Funktion:
In dem genannten Break im vorherigen Code wird die Adresse des free Hooks in $eax
liegen.
Nun wird ein Fast Bin Angriff durchgeführt:
Zunächst wird entdeckt, dass es möglich ist, mit schnellen Chunks der Größe 200 an der Stelle des __free_hook
zu arbeiten:
$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.
Dafür wird ein neuer Chunk der Größe 0xfc
erstellt und die zusammengeführte Funktion wird zweimal mit diesem Zeiger aufgerufen, auf diese Weise erhalten wir einen Zeiger auf einen freigegebenen Chunk der Größe 0xfc*2 = 0x1f8
im Fast Bin.
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 aus dem Fast Bin den vorherigen nutzlosen Chunk 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 mit dem String /bin/sh\x00
freigegeben, indem die Löschfunktion aufgerufen wird, die die __free_hook
-Funktion auslöst, die auf system mit /bin/sh\x00
als Parameter zeigt.