WWW2Exec - .dtors & .fini_array

Unterstützen Sie HackTricks

.dtors

Heutzutage ist es sehr seltsam, eine Binärdatei mit einem .dtors-Abschnitt zu finden!

Die Destruktoren sind Funktionen, die ausgeführt werden, bevor das Programm beendet wird (nachdem die main-Funktion zurückkehrt). Die Adressen dieser Funktionen sind im .dtors-Abschnitt der Binärdatei gespeichert und daher, wenn es Ihnen gelingt, die Adresse eines Shellcodes in __DTOR_END__ zu schreiben, wird dies 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 des Shellcodes, um ihn auszuführen.

Natürlich müssen Sie zuerst einen Speicherort für den Shellcode finden, um ihn später aufrufen zu können.

.fini_array

Im Wesentlichen handelt es sich hierbei um eine Struktur mit Funktionen, die aufgerufen werden, bevor das Programm beendet wird, ähnlich wie bei .dtors. Dies ist interessant, wenn Sie Ihren Shellcode aufrufen können, indem Sie zu einer Adresse springen, oder in Fällen, in denen Sie zurück 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

Ewige Schleife

Um die .fini_array zu missbrauchen und eine ewige Schleife zu erzeugen, können Sie hier überprüfen, was getan wurde: Wenn Sie mindestens 2 Einträge in der .fini_array haben, können Sie:

  • Verwenden Sie Ihren ersten Schreibzugriff, um die anfällige willkürliche Schreibfunktion erneut aufzurufen

  • Berechnen Sie dann die Rücksprungadresse im Stack, die von __libc_csu_fini gespeichert ist (die Funktion, die alle .fini_array-Funktionen aufruft) und setzen Sie dort die Adresse von __libc_csu_fini

  • Dadurch wird __libc_csu_fini sich selbst erneut aufrufen und die .fini_array-Funktionen erneut ausführen, die die anfällige WWW-Funktion zweimal aufrufen werden: einmal für die willkürliche Schreiboperation und ein weiteres Mal, um erneut die Rücksprungadresse von __libc_csu_fini im Stack zu überschreiben, um sich selbst erneut aufzurufen.

Beachten Sie, dass bei Full RELRO**, der Abschnitt .fini_array schreibgeschützt ist. In neueren Versionen wird selbst bei [Partial RELRO] der Abschnitt .fini_array ebenfalls schreibgeschützt gemacht.

Unterstützen Sie HackTricks

Last updated