7.2 KiB
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:
- Wenn Sie Ihr Unternehmen in HackTricks beworben sehen möchten oder HackTricks als PDF herunterladen möchten, überprüfen Sie die ABONNEMENTPLÄNE!
- Holen Sie sich das offizielle PEASS & HackTricks-Merchandise
- Entdecken Sie The PEASS Family, unsere Sammlung exklusiver NFTs
- Treten Sie der 💬 Discord-Gruppe oder der Telegram-Gruppe bei oder folgen Sie uns auf Twitter 🐦 @hacktricks_live.
- Teilen Sie Ihre Hacking-Tricks, indem Sie PRs an die HackTricks und HackTricks Cloud GitHub-Repositories einreichen.
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
{% content-ref url="../rop-return-oriented-programing/ret2lib/one-gadget.md" %} one-gadget.md {% endcontent-ref %}
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:
{% content-ref url="../common-binary-protections-and-bypasses/relro.md" %} relro.md {% endcontent-ref %}
Referenzen
- 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
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!
- Holen Sie sich das offizielle PEASS & HackTricks-Merchandise
- Entdecken Sie The PEASS Family, unsere Sammlung exklusiver NFTs
- Treten Sie der 💬 Discord-Gruppe oder der Telegram-Gruppe bei oder folgen Sie uns auf Twitter 🐦 @hacktricks_live.
- Teilen Sie Ihre Hacking-Tricks, indem Sie PRs an die HackTricks und HackTricks Cloud GitHub-Repositories einreichen.