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`**
![](<../../images/image (121).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`
![](<../../images/image (620) (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:
![](<../../images/image (496).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}}