Basic Stack Binary Exploitation Methodology
Last updated
Last updated
Lernen und üben Sie AWS-Hacking:HackTricks Training AWS Red Team Expert (ARTE) Lernen und üben Sie GCP-Hacking: HackTricks Training GCP Red Team Expert (GRTE)
Bevor Sie etwas ausnutzen, ist es interessant, einen Teil der Struktur einer ELF-Binärdatei zu verstehen:
ELF Basic InformationBei so vielen Techniken ist es gut, ein Schema zu haben, wann jede Technik nützlich sein wird. Beachten Sie, dass die gleichen Schutzmaßnahmen verschiedene Techniken beeinflussen werden. Sie können Möglichkeiten finden, die Schutzmaßnahmen in jedem Schutzabschnitt zu umgehen, aber nicht in dieser Methodik.
Es gibt verschiedene Möglichkeiten, wie Sie den Fluss eines Programms steuern können:
Stapelüberläufe, indem Sie den Rückgabepointer vom Stapel oder den EBP -> ESP -> EIP überschreiben.
Möglicherweise müssen Sie einen Integer-Überlauf missbrauchen, um den Überlauf zu verursachen.
Oder über beliebige Schreibvorgänge + Schreiben von Was Wo zur Ausführung
Formatzeichenfolgen: Missbrauchen Sie printf
, um beliebige Inhalte an beliebige Adressen zu schreiben.
Array-Indizierung: Missbrauchen Sie eine schlecht gestaltete Indizierung, um einige Arrays zu steuern und einen beliebigen Schreibvorgang zu erhalten.
Möglicherweise müssen Sie einen Integer-Überlauf missbrauchen, um den Überlauf zu verursachen.
bof zu WWW über ROP: Missbrauchen Sie einen Pufferüberlauf, um einen ROP zu konstruieren und ein WWW zu erhalten.
Sie finden die Techniken für Schreiben von Was Wo zur Ausführung in:
https://github.com/HackTricks-wiki/hacktricks/blob/de/binary-exploitation/arbitrary-write-2-exec/README.mdEtwas zu beachten ist, dass in der Regel nur eine Ausnutzung einer Schwachstelle möglicherweise nicht ausreicht, um einen erfolgreichen Exploit auszuführen, insbesondere wenn einige Schutzmaßnahmen umgangen werden müssen. Daher ist es interessant, einige Optionen zu diskutieren, um eine einzelne Schwachstelle mehrmals in derselben Ausführung der Binärdatei ausnutzbar zu machen:
Schreiben Sie in einer **ROP-Kette die Adresse der main
-Funktion oder an die Adresse, an der die Schwachstelle auftritt.
Durch Steuern einer ordnungsgemäßen ROP-Kette können Sie alle Aktionen in dieser Kette ausführen.
Schreiben Sie die exit
-Adresse in GOT (oder eine andere Funktion, die von der Binärdatei vor dem Beenden verwendet wird) die Adresse, um zurück zur Schwachstelle zu gelangen.
Wie in .fini_array** erklärt, speichern Sie hier 2 Funktionen, eine zum erneuten Aufruf der Schwachstelle und eine andere zum Aufruf von**__libc_csu_fini
**, die die Funktion aus .fini_array
erneut aufrufen wird.
ret2win: Es gibt eine Funktion im Code, die Sie aufrufen müssen (vielleicht mit bestimmten Parametern), um die Flagge zu erhalten.
In einem bof mit PIE müssen Sie es umgehen
In einem bof mit canary müssen Sie es umgehen
Wenn Sie mehrere Parameter richtig setzen müssen, um die ret2win-Funktion korrekt aufzurufen, können Sie verwenden:
Eine ROP Kette, wenn genügend Gadgets vorhanden sind, um alle Parameter vorzubereiten
SROP (falls Sie diesen Systemaufruf aufrufen können), um viele Register zu steuern
Über ein Schreiben von Was Wo könnten Sie andere Schwachstellen (nicht bof) missbrauchen, um die win
-Funktion aufzurufen.
Pointer-Umleitung: Falls der Stapel Zeiger auf eine Funktion enthält, die aufgerufen wird, oder auf einen String, der von einer interessanten Funktion verwendet wird (system oder printf), ist es möglich, diese Adresse zu überschreiben.
Nicht initialisierte Variablen: Man weiß nie.
(Stack) Shellcode: Dies ist nützlich, um einen Shellcode im Stapel zu speichern, bevor oder nachdem der Rückgabepointer überschrieben wurde, und dann darauf zu springen, um ihn auszuführen:
In jedem Fall, wenn es ein canary** gibt, müssen Sie in einem regulären bof es umgehen (leaken)**
Mit ASLR benötigen Sie Techniken wie ret2esp/ret2reg, um dorthin zu springen
Dies wird Shellcode mit einer ROP-Kette mischen.
Ret2syscall: Nützlich, um execve
aufzurufen und beliebige Befehle auszuführen. Sie müssen in der Lage sein, die Gadgets zu finden, um den spezifischen Syscall mit den Parametern aufzurufen.
SROP kann nützlich sein, um das ret2execve vorzubereiten.
Ret2lib: Nützlich, um eine Funktion aus einer Bibliothek (normalerweise aus libc
) wie system
mit einigen vorbereiteten Argumenten (z. B. '/bin/sh'
) aufzurufen. Sie benötigen die Binärdatei, um die Bibliothek mit der Funktion, die Sie aufrufen möchten (normalerweise libc), zu laden.
Wenn statisch kompiliert und kein PIE, ändert sich die Adresse von system
und /bin/sh
nicht, sodass es möglich ist, sie statisch zu verwenden.
Ohne ASLR und Kenntnis der geladenen libc-Version, ändert sich die Adresse von system
und /bin/sh
nicht, sodass es möglich ist, sie statisch zu verwenden.
Verwenden Sie ret2dlresolve
, um die Adresse von system
aufzulösen und sie aufzurufen
Umgehen Sie ASLR und berechnen Sie die Adresse von system
und '/bin/sh'
im Speicher.
PIE umgehen
Die verwendete libc
-Version finden (ein paar Funktionsadressen leaken)
Überprüfen Sie die vorherigen Szenarien mit ASLR, um fortzufahren.
Stack Pivoting / EBP2Ret / EBP Chaining: Kontrollieren Sie den ESP, um RET über den gespeicherten EBP im Stack zu steuern.
Nützlich für off-by-one Stack-Überläufe
Nützlich als alternative Möglichkeit, EIP zu kontrollieren, während EIP missbraucht wird, um die Nutzlast im Speicher zu konstruieren und dann über EBP darauf zu springen
Pointer-Umleitung: Falls der Stack Zeiger auf eine Funktion enthält, die aufgerufen wird, oder auf einen String, der von einer interessanten Funktion verwendet wird (system oder printf), ist es möglich, diese Adresse zu überschreiben.
Nicht initialisierte Variablen: Man weiß nie
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)