WWW2Exec - GOT/PLT

Erlernen Sie AWS-Hacking von Null auf Held mit htARTE (HackTricks AWS Red Team Expert)!

Andere Möglichkeiten, HackTricks zu unterstützen:

Grundlegende Informationen

GOT: Global Offset Table

Die Global Offset Table (GOT) ist ein Mechanismus, der in dynamisch verknüpften Binärdateien verwendet wird, um die Adressen externer Funktionen zu verwalten. Da diese Adressen erst zur Laufzeit bekannt sind (aufgrund der dynamischen Verknüpfung), 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 derselben Funktion verwenden die in der GOT gespeicherte Adresse, um den Overhead der erneuten Adressauflösung zu vermeiden.

PLT: Procedure Linkage Table

Die Procedure Linkage Table (PLT) arbeitet eng mit der GOT zusammen und dient als Trampolin, um Aufrufe externer Funktionen zu verarbeiten. 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, wenn sie noch nicht aufgelöst wurde. Nachdem die Adresse aufgelöst ist, 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 nach dem Laden des ausführbaren Codes in GEF die Funktionen in der GOT angezeigt werden können: gef➤ x/20x 0xDIR_GOT

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

GOT2Exec

In einem Binärcode enthält die GOT die Adressen der Funktionen oder des PLT-Abschnitts, der die Funktionsadresse laden wird. Das Ziel dieses willkürlichen Schreibens besteht darin, einen GOT-Eintrag zu überschreiben, der später mit der Adresse des PLT der system-Funktion beispielsweise ausgeführt wird.

Idealerweise überschreiben Sie die GOT einer Funktion, die mit von Ihnen kontrollierten Parametern aufgerufen wird (damit Sie die an die Systemfunktion gesendeten Parameter steuern können).

Wenn system nicht vom Skript verwendet wird, 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 verweisen.

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 partiellem RELRO kompiliert, was sie zu einem interessanten Ziel macht, vorausgesetzt, dass es möglich ist, ihre Adresse herauszufinden (ASLR).

Gemeinsame Funktionen der libc werden andere interne Funktionen aufrufen, deren GOT überschrieben werden könnte, um Codeausführung zu erhalten.

Finden Sie weitere Informationen zu dieser Technik hier.

Ein Gadget

pageOne Gadget

Schutzmaßnahmen

Der Schutz Full RELRO soll diese Art von Technik schützen, indem alle Adressen der Funktionen beim Starten der Binärdatei aufgelöst und die GOT-Tabelle nachher schreibgeschützt gemacht wird:

pageRelro

Referenzen

Erlernen Sie AWS-Hacking von Null auf Held mit htARTE (HackTricks AWS Red Team Expert)!

Andere Möglichkeiten, HackTricks zu unterstützen:

Last updated