WWW2Exec - GOT/PLT

Reading time: 6 minutes

tip

Lernen & üben Sie AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Lernen & üben Sie GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)

Unterstützen Sie HackTricks

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

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

Mit GEF können Sie eine Debugging-Sitzung starten und got ausführen, um die GOT-Tabelle zu sehen:

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).

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.

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

One Gadget

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.

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:

Relro

Referenzen

tip

Lernen & üben Sie AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Lernen & üben Sie GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)

Unterstützen Sie HackTricks