mirror of
https://github.com/HackTricks-wiki/hacktricks.git
synced 2025-10-10 18:36:50 +00:00
90 lines
6.3 KiB
Markdown
90 lines
6.3 KiB
Markdown
# WWW2Exec - GOT/PLT
|
|
|
|
{{#include ../../banners/hacktricks-training.md}}
|
|
|
|
## **Grundinformationen**
|
|
|
|
### **GOT: Global Offset Table**
|
|
|
|
Die **Global Offset Table (GOT)** ist ein Mechanismus, der in dynamisch verlinkten Binärdateien verwendet wird, um die **Adressen externer Funktionen** zu verwalten. Da diese **Adressen bis zur Laufzeit nicht bekannt sind** (aufgrund der dynamischen Verlinkung), bietet die GOT eine Möglichkeit, die **Adressen dieser externen Symbole dynamisch zu aktualisieren**, sobald sie aufgelöst sind.
|
|
|
|
Jeder Eintrag in der GOT entspricht einem Symbol in den externen Bibliotheken, die die Binärdatei aufrufen kann. Wenn eine **Funktion zum ersten Mal aufgerufen wird, wird ihre tatsächliche Adresse vom dynamischen Linker aufgelöst und in der GOT gespeichert**. Nachfolgende Aufrufe der gleichen Funktion verwenden die in der GOT gespeicherte Adresse, wodurch der Overhead der erneuten Adressauflösung vermieden wird.
|
|
|
|
### **PLT: Procedure Linkage Table**
|
|
|
|
Die **Procedure Linkage Table (PLT)** arbeitet eng mit der GOT zusammen und dient als Trampolin, um Aufrufe an externe Funktionen zu handhaben. Wenn eine Binärdatei **eine externe Funktion zum ersten Mal aufruft, wird die Kontrolle an einen Eintrag in der PLT übergeben, der mit dieser Funktion verknüpft ist**. Dieser PLT-Eintrag ist dafür verantwortlich, den dynamischen Linker aufzurufen, um die Adresse der Funktion aufzulösen, falls sie noch nicht aufgelöst wurde. Nachdem die Adresse aufgelöst wurde, wird sie in der **GOT** gespeichert.
|
|
|
|
**Daher** werden GOT-Einträge direkt verwendet, sobald die Adresse einer externen Funktion oder Variablen aufgelöst ist. **PLT-Einträge werden verwendet, um die anfängliche Auflösung** dieser Adressen über den dynamischen Linker zu erleichtern.
|
|
|
|
## Ausführung erhalten
|
|
|
|
### Überprüfen der GOT
|
|
|
|
Holen Sie sich die Adresse der GOT-Tabelle mit: **`objdump -s -j .got ./exec`**
|
|
|
|
.png>)
|
|
|
|
Beobachten Sie, wie Sie nach dem **Laden** der **ausführbaren Datei** in GEF die **Funktionen** sehen können, die in der **GOT** sind: `gef➤ x/20x 0xADDR_GOT`
|
|
|
|
 (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (2) (2) (2).png>)
|
|
|
|
Mit GEF können Sie eine **Debugging**-Sitzung **starten** und **`got`** ausführen, um die GOT-Tabelle zu sehen:
|
|
|
|
.png>)
|
|
|
|
### GOT2Exec
|
|
|
|
In einer Binärdatei hat die GOT die **Adressen zu den Funktionen oder** zum **PLT**-Abschnitt, der die Funktionsadresse lädt. Das Ziel dieses willkürlichen Schreibens ist es, einen **GOT-Eintrag** einer Funktion, die später ausgeführt wird, **mit** der **Adresse** des PLT der **`system`** **Funktion** beispielsweise zu überschreiben.
|
|
|
|
Idealerweise werden Sie die **GOT** einer **Funktion** überschreiben, die **mit von Ihnen kontrollierten Parametern aufgerufen wird** (so dass Sie die an die Systemfunktion gesendeten Parameter steuern können).
|
|
|
|
Wenn **`system`** **nicht verwendet wird** von der Binärdatei, wird die Systemfunktion **keinen** Eintrag in der PLT haben. In diesem Szenario müssen Sie **zuerst die Adresse** der `system`-Funktion leaken und dann die GOT überschreiben, um auf diese Adresse zu zeigen.
|
|
|
|
Sie können die PLT-Adressen mit **`objdump -j .plt -d ./vuln_binary`** sehen.
|
|
|
|
## libc GOT-Einträge
|
|
|
|
Die **GOT von libc** wird normalerweise mit **teilweisem RELRO** kompiliert, was sie zu einem attraktiven Ziel macht, vorausgesetzt, es ist möglich, ihre Adresse herauszufinden ([**ASLR**](../common-binary-protections-and-bypasses/aslr/index.html)).
|
|
|
|
Häufige Funktionen der libc rufen **andere interne Funktionen** auf, deren GOT überschrieben werden könnte, um eine Codeausführung zu erhalten.
|
|
|
|
Finden Sie [**weitere Informationen zu dieser Technik hier**](https://github.com/nobodyisnobody/docs/blob/main/code.execution.on.last.libc/README.md#1---targetting-libc-got-entries).
|
|
|
|
### **Free2system**
|
|
|
|
In Heap-Exploitation-CTFs ist es üblich, den Inhalt von Chunks zu kontrollieren und irgendwann sogar die GOT-Tabelle zu überschreiben. Ein einfacher Trick, um RCE zu erhalten, wenn keine Gadgets verfügbar sind, besteht darin, die `free` GOT-Adresse auf `system` zu überschreiben und in einen Chunk `"/bin/sh"` zu schreiben. Auf diese Weise wird, wenn dieser Chunk freigegeben wird, `system("/bin/sh")` ausgeführt.
|
|
|
|
### **Strlen2system**
|
|
|
|
Eine weitere gängige Technik besteht darin, die **`strlen`** GOT-Adresse auf **`system`** zu überschreiben, sodass, wenn diese Funktion mit Benutzereingaben aufgerufen wird, es möglich ist, den String `"/bin/sh"` zu übergeben und eine Shell zu erhalten.
|
|
|
|
Darüber hinaus, wenn `puts` mit Benutzereingaben verwendet wird, ist es möglich, die `strlen` GOT-Adresse auf `system` zu überschreiben und den String `"/bin/sh"` zu übergeben, um eine Shell zu erhalten, da **`puts` `strlen` mit der Benutzereingabe aufruft**.
|
|
|
|
## **One Gadget**
|
|
|
|
{{#ref}}
|
|
../rop-return-oriented-programing/ret2lib/one-gadget.md
|
|
{{#endref}}
|
|
|
|
## **Missbrauch der GOT aus dem Heap**
|
|
|
|
Eine gängige Methode, um RCE aus einer Heap-Sicherheitsanfälligkeit zu erhalten, besteht darin, einen Fastbin auszunutzen, sodass es möglich ist, den Teil der GOT-Tabelle in den Fastbin hinzuzufügen, sodass, wann immer dieser Chunk zugewiesen wird, es möglich ist, **den Zeiger einer Funktion, normalerweise `free`**, zu überschreiben.\
|
|
Dann wird `free` auf `system` gezeigt und das Freigeben eines Chunks, in dem `/bin/sh\x00` geschrieben wurde, wird eine Shell ausführen.
|
|
|
|
Es ist möglich, ein [**Beispiel hier zu finden**](https://ctf-wiki.mahaloz.re/pwn/linux/glibc-heap/chunk_extend_overlapping/#hitcon-trainging-lab13)**.**
|
|
|
|
## **Schutzmaßnahmen**
|
|
|
|
Der **Full RELRO**-Schutz soll gegen diese Art von Technik schützen, indem alle Adressen der Funktionen beim Start der Binärdatei aufgelöst werden und die **GOT-Tabelle danach schreibgeschützt** gemacht wird:
|
|
|
|
{{#ref}}
|
|
../common-binary-protections-and-bypasses/relro.md
|
|
{{#endref}}
|
|
|
|
## Referenzen
|
|
|
|
- [https://ir0nstone.gitbook.io/notes/types/stack/got-overwrite/exploiting-a-got-overwrite](https://ir0nstone.gitbook.io/notes/types/stack/got-overwrite/exploiting-a-got-overwrite)
|
|
- [https://ir0nstone.gitbook.io/notes/types/stack/one-gadgets-and-malloc-hook](https://ir0nstone.gitbook.io/notes/types/stack/one-gadgets-and-malloc-hook)
|
|
|
|
{{#include ../../banners/hacktricks-training.md}}
|