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

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

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

bash
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