Ret2win
Last updated
Last updated
Learn & practice AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE) Learn & practice GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
Ret2win-Herausforderungen sind eine beliebte Kategorie in Capture The Flag (CTF)-Wettbewerben, insbesondere bei Aufgaben, die binary exploitation beinhalten. Das Ziel ist es, eine Schwachstelle in einem gegebenen Binary auszunutzen, um eine spezifische, nicht aufgerufene Funktion innerhalb des Binaries auszuführen, die oft etwas wie win
, flag
usw. genannt wird. Diese Funktion gibt, wenn sie ausgeführt wird, normalerweise ein Flag oder eine Erfolgsmeldung aus. Die Herausforderung besteht typischerweise darin, die Rücksprungadresse auf dem Stack zu überschreiben, um den Ausführungsfluss zur gewünschten Funktion umzuleiten. Hier ist eine detailliertere Erklärung mit Beispielen:
Betrachten Sie ein einfaches C-Programm mit einer Schwachstelle und einer win
-Funktion, die wir aufrufen möchten:
Um dieses Programm ohne Stack-Schutz und mit ASLR deaktiviert zu kompilieren, können Sie den folgenden Befehl verwenden:
-m32
: Kompiliere das Programm als 32-Bit-Binärdatei (dies ist optional, aber häufig in CTF-Herausforderungen).
-fno-stack-protector
: Deaktiviere den Schutz gegen Stack-Überläufe.
-z execstack
: Erlaube die Ausführung von Code im Stack.
-no-pie
: Deaktiviere Position Independent Executable, um sicherzustellen, dass die Adresse der win
-Funktion sich nicht ändert.
-o vulnerable
: Nenne die Ausgabedatei vulnerable
.
Für den Exploit verwenden wir pwntools, ein leistungsstarkes CTF-Framework zum Schreiben von Exploits. Das Exploit-Skript erstellt eine Payload, um den Puffer zu überlaufen und die Rücksprungadresse mit der Adresse der win
-Funktion zu überschreiben.
Um die Adresse der win
-Funktion zu finden, können Sie gdb, objdump oder ein anderes Tool verwenden, das es Ihnen ermöglicht, Binärdateien zu inspizieren. Zum Beispiel könnten Sie mit objdump
Folgendes verwenden:
Dieser Befehl zeigt Ihnen die Assemblierung der win
-Funktion, einschließlich ihrer Startadresse.
Das Python-Skript sendet eine sorgfältig gestaltete Nachricht, die, wenn sie von der vulnerable_function
verarbeitet wird, den Puffer überläuft und die Rücksprungadresse auf dem Stack mit der Adresse von win
überschreibt. Wenn vulnerable_function
zurückkehrt, springt es anstelle der Rückkehr zu main
oder des Verlassens zu win
, und die Nachricht wird gedruckt.
PIE sollte deaktiviert sein, damit die Adresse über mehrere Ausführungen hinweg zuverlässig ist, oder die Adresse, an der die Funktion gespeichert wird, wird nicht immer gleich sein und Sie benötigen einen Leak, um herauszufinden, wo die win-Funktion geladen ist. In einigen Fällen, wenn die Funktion, die den Überlauf verursacht, read
oder ähnlich ist, können Sie eine Teilweise Überschreibung von 1 oder 2 Bytes durchführen, um die Rücksprungadresse auf die win-Funktion zu ändern. Aufgrund der Funktionsweise von ASLR sind die letzten drei hexadezimalen Nibbles nicht randomisiert, sodass es eine 1/16 Chance (1 Nibble) gibt, die korrekte Rücksprungadresse zu erhalten.
Stack Canaries sollten ebenfalls deaktiviert sein, oder die kompromittierte EIP-Rücksprungadresse wird niemals befolgt.
32 Bit, kein ASLR
64 Bit mit ASLR, mit einem Leak der Bin-Adresse
64 Bit, kein ASLR
32 Bit, kein ASLR, doppelter kleiner Überlauf, zuerst den Stack überlaufen und die Größe des zweiten Überlaufs vergrößern
32 Bit, relro, kein Canary, nx, kein pie, Format-String zur Überschreibung der Adresse fflush
mit der win-Funktion (ret2win)
32 Bit, nx, nichts anderes, teilweise Überschreibung von EIP (1 Byte), um die win-Funktion aufzurufen
32 Bit, nx, nichts anderes, teilweise Überschreibung von EIP (1 Byte), um die win-Funktion aufzurufen
Das Programm validiert nur das letzte Byte einer Zahl, um die Größe der Eingabe zu überprüfen, daher ist es möglich, jede Größe hinzuzufügen, solange das letzte Byte im erlaubten Bereich liegt. Dann erzeugt die Eingabe einen Pufferüberlauf, der mit einem ret2win ausgenutzt wird.
64 Bit, relro, kein Canary, nx, pie. Teilweise Überschreibung, um die win-Funktion (ret2win) aufzurufen
arm64, PIE, es gibt einen PIE-Leak, die win-Funktion ist tatsächlich 2 Funktionen, also ROP-Gadget, das 2 Funktionen aufruft
ARM64, off-by-one, um eine win-Funktion aufzurufen
Lernen & üben Sie AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE) Lernen & üben Sie GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)