Ret2win
Grundlegende Informationen
Ret2win-Herausforderungen sind eine beliebte Kategorie in Capture The Flag (CTF)-Wettbewerben, insbesondere bei Aufgaben, die binäre Ausnutzung beinhalten. Das Ziel besteht darin, eine Schwachstelle in einem gegebenen Binärfile auszunutzen, um eine bestimmte, nicht aufgerufene Funktion innerhalb des Binärfiles auszuführen, die oft etwas wie win
, flag
usw. genannt wird. Diese Funktion gibt normalerweise eine Flagge oder eine Erfolgsmeldung aus, wenn sie ausgeführt wird. Die Herausforderung beinhaltet in der Regel das Überschreiben der Rückkehradresse auf dem Stack, um den Ausführungsfluss zur gewünschten Funktion umzuleiten. Hier ist eine detailliertere Erklärung mit Beispielen:
C-Beispiel
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 deaktiviertem ASLR zu kompilieren, können Sie den folgenden Befehl verwenden:
-m32
: Kompiliere das Programm als 32-Bit-Binärdatei (dies ist optional, aber üblich bei CTF-Herausforderungen).-fno-stack-protector
: Deaktiviere Schutzmaßnahmen gegen Stack-Überläufe.-z execstack
: Erlaube die Ausführung von Code auf dem Stack.-no-pie
: Deaktiviere Position Independent Executable, um sicherzustellen, dass die Adresse derwin
-Funktion nicht geändert wird.-o vulnerable
: Benenne die Ausgabedatei alsvulnerable
.
Python-Exploit mit Pwntools
Für den Exploit verwenden wir pwntools, ein leistungsstarkes CTF-Framework zum Schreiben von Exploits. Das Exploit-Skript wird ein Payload erstellen, 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 Assembly des win
-Funktion, einschließlich ihrer Startadresse.
Das Python-Skript sendet eine sorgfältig erstellte Nachricht, die, wenn sie von der vulnerable_function
verarbeitet wird, den Puffer überläuft und die Rückkehradresse auf dem Stapel mit der Adresse von win
überschreibt. Wenn vulnerable_function
zurückkehrt, anstatt zu main
zurückzukehren oder zu beenden, springt es zu win
, und die Nachricht wird gedruckt.
Schutzmaßnahmen
PIE sollte deaktiviert sein, damit die Adresse bei verschiedenen Ausführungen zuverlässig ist, oder die Adresse, an der die Funktion gespeichert wird, ist nicht immer gleich, und Sie bräuchten ein Leck, 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ückkehradresse auf die win-Funktion zu ändern. Aufgrund der Funktionsweise von ASLR sind die letzten drei Hex-Nibbles nicht zufällig, sodass es eine 1/16-Chance (1 Nibble) gibt, die richtige Rückkehradresse zu erhalten.Stack Canaries sollten ebenfalls deaktiviert sein, da die kompromittierte EIP-Rückkehradresse niemals befolgt wird.
Weitere Beispiele & Referenzen
32-Bit, kein ASLR
64-Bit mit ASLR, mit einem Leck der Bin-Adresse
64-Bit, kein ASLR
32-Bit, kein ASLR, doppelter kleiner Überlauf, zuerst um den Stapel zu überlaufen und die Größe des zweiten Überlaufs zu vergrößern
32-Bit, relro, kein Canary, nx, kein PIE, Formatzeichenfolge zum Überschreiben 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 führt die Eingabe einen Pufferüberlauf aus, der mit einem ret2win ausgenutzt wird.
64-Bit, relro, kein Canary, nx, PIE. Teilweise Überschreibung, um die win-Funktion aufzurufen (ret2win)
ARM64, PIE, es gibt ein PIE-Leck, die win-Funktion besteht tatsächlich aus 2 Funktionen, sodass ein ROP-Gadget, das 2 Funktionen aufruft
ARM64, Off-by-One, um eine win-Funktion aufzurufen
ARM64 Beispiel
pageRet2win - arm64Last updated