# Grundlegende Methodik der binären Ausnutzung
Erlernen Sie AWS-Hacking von Grund auf mit htARTE (HackTricks AWS Red Team Expert)!
Andere Möglichkeiten, HackTricks zu unterstützen:
* Wenn Sie Ihr **Unternehmen in HackTricks beworben sehen möchten** oder **HackTricks im PDF-Format herunterladen möchten**, überprüfen Sie die [**ABONNEMENTPLÄNE**](https://github.com/sponsors/carlospolop)!
* Holen Sie sich das [**offizielle PEASS & HackTricks-Merchandise**](https://peass.creator-spring.com)
* Entdecken Sie [**The PEASS Family**](https://opensea.io/collection/the-peass-family), unsere Sammlung exklusiver [**NFTs**](https://opensea.io/collection/the-peass-family)
* **Treten Sie der** 💬 [**Discord-Gruppe**](https://discord.gg/hRep4RUj7f) oder der [**Telegramm-Gruppe**](https://t.me/peass) bei oder **folgen** Sie uns auf **Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
* **Teilen Sie Ihre Hacking-Tricks, indem Sie PRs an die** [**HackTricks**](https://github.com/carlospolop/hacktricks) und [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) GitHub-Repositories einreichen.
## ELF Grundlegende Informationen
Bevor Sie mit der Ausnutzung von etwas beginnen, ist es interessant, einen Teil der Struktur einer **ELF-Binärdatei** zu verstehen:
{% content-ref url="elf-tricks.md" %}
[elf-tricks.md](elf-tricks.md)
{% endcontent-ref %}
## Ausnutzungswerkzeuge
{% content-ref url="tools/" %}
[tools](tools/)
{% endcontent-ref %}
## Stapelüberlauf-Methodik
Bei 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.
## Kontrolle des Flusses
Es gibt verschiedene Möglichkeiten, wie Sie den Fluss eines Programms kontrollieren könnten:
* [**Stapelüberläufe**](../stack-overflow/), bei denen der Rückgabepointer vom Stapel oder der EBP -> ESP -> EIP überschrieben wird.
* Möglicherweise müssen Sie einen [**ganzzahligen Überlauf**](../integer-overflow.md) missbrauchen, um den Überlauf zu verursachen.
* Oder über **beliebtes Schreiben + Schreiben von Was Wo zur Ausführung**
* [**Formatzeichenfolgen**](../format-strings/)**:** Missbrauchen Sie `printf`, um beliebige Inhalte an beliebigen Adressen zu schreiben.
* [**Array-Indizierung**](../array-indexing.md): Missbrauchen Sie eine schlecht gestaltete Indizierung, um einige Arrays zu steuern und ein beliebiges Schreiben zu erhalten.
* Möglicherweise müssen Sie einen [**ganzzahligen Überlauf**](../integer-overflow.md) missbrauchen, um den Überlauf zu verursachen.
* **bof zu WWW über ROP**: Missbrauchen Sie einen Pufferüberlauf, um eine ROP zu konstruieren und ein WWW zu erhalten.
Sie finden die Techniken für das **Schreiben von Was Wo zur Ausführung** in:
{% content-ref url="../arbitrary-write-2-exec/" %}
[arbitrary-write-2-exec](../arbitrary-write-2-exec/)
{% endcontent-ref %}
## Ewige Schleifen
Etwas zu beachten ist, dass normalerweise **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**](../arbitrary-write-2-exec/www2exec-.dtors-and-.fini\_array.md#eternal-loop) erklärt, speichern Sie hier 2 Funktionen, eine um die Schwachstelle erneut aufzurufen und eine andere, um **`__libc_csu_fini`** aufzurufen, die die Funktion aus `.fini_array` erneut aufrufen wird.
## Ausnutzungsziele
### Ziel: Aufruf einer vorhandenen Funktion
* [**ret2win**](./#ret2win): Es gibt eine Funktion im Code, die Sie aufrufen müssen (vielleicht mit bestimmten Parametern), um die Flagge zu erhalten.
* In einem **regulären bof ohne** [**PIE**](../common-binary-protections-and-bypasses/pie/) **und** [**canary**](../common-binary-protections-and-bypasses/stack-canaries/) müssen Sie nur die Adresse im Rückgabeadressspeicher im Stapel schreiben.
* In einem bof mit [**PIE**](../common-binary-protections-and-bypasses/pie/) müssen Sie es umgehen
* In einem bof mit [**canary**](../common-binary-protections-and-bypasses/stack-canaries/) 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**](./#rop-and-ret2...-techniques) **Kette, wenn genügend Gadgets vorhanden sind**, um alle Parameter vorzubereiten
* [**SROP**](../rop-return-oriented-programing/srop-sigreturn-oriented-programming.md) (falls Sie diesen Systemaufruf aufrufen können), um viele Register zu steuern
* Gadgets von [**ret2csu**](../rop-return-oriented-programing/ret2csu.md) und [**ret2vdso**](../rop-return-oriented-programing/ret2vdso.md), um mehrere Register zu steuern
* Über ein [**Schreiben von Was Wo**](../arbitrary-write-2-exec/) könnten Sie andere Schwachstellen (nicht bof) missbrauchen, um die **`win`**-Funktion aufzurufen.
* [**Pointer-Umleitung**](../stack-overflow/pointer-redirecting.md): 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.
* [**ASLR**](../common-binary-protections-and-bypasses/aslr/) oder [**PIE**](../common-binary-protections-and-bypasses/pie/) könnten die Adressen beeinflussen.
* [**Nicht initialisierte Variablen**](../stack-overflow/uninitialized-variables.md): Man weiß nie.
### Ziel: RCE
#### Über Shellcode, wenn nx deaktiviert ist oder Shellcode mit ROP gemischt wird:
* [**(Stack) Shellcode**](./#stack-shellcode): Dies ist nützlich, um einen Shellcode im Stapel zu speichern, bevor oder nachdem der Rückgabepointer überschrieben wird, und dann **darauf zu springen**, um ihn auszuführen:
* **In jedem Fall, wenn es ein** [**canary**](../common-binary-protections-and-bypasses/stack-canaries/)** gibt, müssen Sie in einem regulären bof es umgehen (leaken)**
* **Ohne** [**ASLR**](../common-binary-protections-and-bypasses/aslr/) **und** [**nx**](../common-binary-protections-and-bypasses/no-exec-nx.md) ist es möglich, zur Adresse des Stapels zu springen, da sie sich nie ändern wird
* **Mit** [**ASLR**](../common-binary-protections-and-bypasses/aslr/) benötigen Sie Techniken wie [**ret2esp/ret2reg**](../rop-return-oriented-programing/ret2esp-ret2reg.md), um dorthin zu springen
* **Mit** [**nx**](../common-binary-protections-and-bypasses/no-exec-nx.md) müssen Sie einige [**ROP**](../rop-return-oriented-programing/) verwenden, um `memprotect` aufzurufen und einige Seiten `rwx` zu machen, um dann den Shellcode dort zu speichern (zum Beispiel read aufrufen) und dann dorthin zu springen.
* Dies wird Shellcode mit einer ROP-Kette mischen.
#### Über Syscalls
* [**Ret2syscall**](../rop-return-oriented-programing/rop-syscall-execv.md): 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**.
* Wenn [**ASLR**](../common-binary-protections-and-bypasses/aslr/) oder [**PIE**](../common-binary-protections-and-bypasses/pie/) aktiviert sind, müssen Sie sie **besiegen, um ROP-Gadgets** aus der Binärdatei oder Bibliotheken zu verwenden.
* [**SROP**](../rop-return-oriented-programing/srop-sigreturn-oriented-programming.md) kann nützlich sein, um das **ret2execve** vorzubereiten.
* Gadgets aus [**ret2csu**](../rop-return-oriented-programing/ret2csu.md) und [**ret2vdso**](../rop-return-oriented-programing/ret2vdso.md), um mehrere Register zu kontrollieren
#### Über libc
* [**Ret2lib**](../rop-return-oriented-programing/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**](../common-binary-protections-and-bypasses/pie/), ändert sich die **Adresse** von `system` und `/bin/sh` nicht, sodass sie statisch verwendet werden können.
* **Ohne** [**ASLR**](../common-binary-protections-and-bypasses/aslr/) **und Kenntnis der geladenen libc-Version**, ändert sich die **Adresse** von `system` und `/bin/sh` nicht, sodass sie statisch verwendet werden können.
* Mit [**ASLR**](../common-binary-protections-and-bypasses/aslr/) **aber ohne** [**PIE**](../common-binary-protections-and-bypasses/pie/), Kenntnis der libc und wenn die Binärdatei die Funktion `system` verwendet, ist es möglich, zum Adressbereich von system im GOT zu **`ret` mit der Adresse von `'/bin/sh'` im Parameter** zu springen (dies müssen Sie herausfinden).
* Mit [ASLR](../common-binary-protections-and-bypasses/aslr/) aber ohne [PIE](../common-binary-protections-and-bypasses/pie/), Kenntnis der libc und **ohne die Binärdatei, die `system` verwendet**:
* Verwenden Sie [**`ret2dlresolve`**](../rop-return-oriented-programing/ret2dlresolve.md), um die Adresse von `system` aufzulösen und sie aufzurufen
* **Umgehen** Sie [**ASLR**](../common-binary-protections-and-bypasses/aslr/) und berechnen Sie die Adresse von `system` und `'/bin/sh'` im Speicher.
* **Mit** [**ASLR**](../common-binary-protections-and-bypasses/aslr/) **und** [**PIE**](../common-binary-protections-and-bypasses/pie/) **und ohne Kenntnis der libc**: Sie müssen:
* [**PIE**](../common-binary-protections-and-bypasses/pie/) umgehen
* Die verwendete **`libc`-Version** finden (ein paar Funktionsadressen leaken)
* Überprüfen Sie die **vorherigen Szenarien mit ASLR**, um fortzufahren.
#### Über EBP/RBP
* [**Stack Pivoting / EBP2Ret / EBP Chaining**](../stack-overflow/stack-pivoting-ebp2ret-ebp-chaining.md): 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
#### Sonstiges
* [**Pointer-Umleitung**](../stack-overflow/pointer-redirecting.md): 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.
* [**ASLR**](../common-binary-protections-and-bypasses/aslr/) oder [**PIE**](../common-binary-protections-and-bypasses/pie/) könnten die Adressen beeinflussen.
* [**Nicht initialisierte Variablen**](../stack-overflow/uninitialized-variables.md): Man weiß nie
Erlernen Sie AWS-Hacking von Null auf Held mit htARTE (HackTricks AWS Red Team Expert)!
Andere Möglichkeiten, HackTricks zu unterstützen:
* Wenn Sie Ihr **Unternehmen in HackTricks beworben sehen möchten** oder **HackTricks als PDF herunterladen möchten**, überprüfen Sie die [**ABONNEMENTPLÄNE**](https://github.com/sponsors/carlospolop)!
* Holen Sie sich das [**offizielle PEASS & HackTricks-Merch**](https://peass.creator-spring.com)
* Entdecken Sie [**The PEASS Family**](https://opensea.io/collection/the-peass-family), unsere Sammlung exklusiver [**NFTs**](https://opensea.io/collection/the-peass-family)
* **Treten Sie der** 💬 [**Discord-Gruppe**](https://discord.gg/hRep4RUj7f) oder der [**Telegram-Gruppe**](https://t.me/peass) bei oder **folgen** Sie uns auf **Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
* **Teilen Sie Ihre Hacking-Tricks, indem Sie PRs an die** [**HackTricks**](https://github.com/carlospolop/hacktricks) und [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) GitHub-Repositories senden.