WWW2Exec - .dtors & .fini_array
Reading time: 3 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.
.dtors
caution
Heutzutage ist es sehr seltsam, ein Binary mit einer .dtors-Sektion zu finden!
Die Destruktoren sind Funktionen, die ausgeführt werden, bevor das Programm endet (nachdem die main
-Funktion zurückkehrt).
Die Adressen dieser Funktionen werden im .dtors
-Abschnitt des Binaries gespeichert und daher, wenn es Ihnen gelingt, die Adresse zu einem Shellcode in __DTOR_END__
zu schreiben, wird dieser ausgeführt, bevor das Programm endet.
Holen Sie sich die Adresse dieses Abschnitts mit:
objdump -s -j .dtors /exec
rabin -s /exec | grep “__DTOR”
Normalerweise finden Sie die DTOR-Marker zwischen den Werten ffffffff
und 00000000
. Wenn Sie also nur diese Werte sehen, bedeutet das, dass keine Funktion registriert ist. Überschreiben Sie also die 00000000
mit der Adresse zum Shellcode, um ihn auszuführen.
warning
Natürlich müssen Sie zuerst einen Platz zum Speichern des Shellcodes finden, um ihn später aufzurufen.
.fini_array
Im Wesentlichen handelt es sich um eine Struktur mit Funktionen, die aufgerufen werden, bevor das Programm endet, wie .dtors
. Dies ist interessant, wenn Sie Ihren Shellcode einfach durch einen Sprung zu einer Adresse aufrufen können, oder in Fällen, in denen Sie wieder zu main
gehen müssen, um die Schwachstelle ein zweites Mal auszunutzen.
objdump -s -j .fini_array ./greeting
./greeting: file format elf32-i386
Contents of section .fini_array:
8049934 a0850408
#Put your address in 0x8049934
Beachten Sie, dass, wenn eine Funktion aus der .fini_array
ausgeführt wird, sie zur nächsten übergeht, sodass sie nicht mehrmals ausgeführt wird (was ewige Schleifen verhindert), sondern dass Ihnen auch nur 1 Ausführung der Funktion gegeben wird, die hier platziert ist.
Beachten Sie, dass die Einträge in der .fini_array
in umgekehrter Reihenfolge aufgerufen werden, sodass Sie wahrscheinlich von dem letzten Eintrag aus schreiben möchten.
Ewige Schleife
Um .fini_array
auszunutzen, um eine ewige Schleife zu erhalten, können Sie überprüfen, was hier gemacht wurde: Wenn Sie mindestens 2 Einträge in der .fini_array
haben, können Sie:
- Verwenden Sie Ihren ersten Schreibvorgang, um die anfällige Funktion für willkürliches Schreiben erneut aufzurufen
- Berechnen Sie dann die Rücksprungadresse im Stack, die von
__libc_csu_fini
gespeichert wird (der Funktion, die alle.fini_array
-Funktionen aufruft), und setzen Sie dort die Adresse von__libc_csu_fini
- Dies wird dazu führen, dass
__libc_csu_fini
sich selbst erneut aufruft und die.fini_array
-Funktionen erneut ausführt, was die anfällige WWW-Funktion 2 Mal aufruft: einmal für willkürliches Schreiben und ein weiteres Mal, um die Rücksprungadresse von__libc_csu_fini
im Stack erneut zu überschreiben, um sich selbst erneut aufzurufen.
caution
Beachten Sie, dass mit Full RELRO, der Abschnitt .fini_array
schreibgeschützt ist.
In neueren Versionen ist der Abschnitt .fini_array
auch bei [Partial RELRO] schreibgeschützt.
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.