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
- Überprüfen Sie die Abonnementpläne!
- Treten Sie der 💬 Discord-Gruppe oder der Telegram-Gruppe bei oder folgen Sie uns auf Twitter 🐦 @hacktricks_live.
- Teilen Sie Hacking-Tricks, indem Sie PRs an die HackTricks und HackTricks Cloud GitHub-Repos senden.
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
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:
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
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
- Überprüfen Sie die Abonnementpläne!
- Treten Sie der 💬 Discord-Gruppe oder der Telegram-Gruppe bei oder folgen Sie uns auf Twitter 🐦 @hacktricks_live.
- Teilen Sie Hacking-Tricks, indem Sie PRs an die HackTricks und HackTricks Cloud GitHub-Repos senden.