hacktricks/binary-exploitation/arbitrary-write-2-exec/www2exec-.dtors-and-.fini_array.md

5.3 KiB

WWW2Exec - .dtors & .fini_array

{% hint style="success" %} Ucz się i praktykuj Hacking AWS:HackTricks Training AWS Red Team Expert (ARTE)
Ucz się i praktykuj Hacking GCP: HackTricks Training GCP Red Team Expert (GRTE)

Wesprzyj HackTricks
{% endhint %}

.dtors

{% hint style="danger" %} Obecnie jest bardzo dziwne znalezienie binarki z sekcją .dtors! {% endhint %}

Destruktory to funkcje, które są wykonywane przed zakończeniem programu (po zwróceniu funkcji main).
Adresy tych funkcji są przechowywane w sekcji .dtors binarki, dlatego jeśli uda ci się zapisać adres do shellcode w __DTOR_END__, to zostanie wykonany przed zakończeniem programu.

Pobierz adres tej sekcji za pomocą:

objdump -s -j .dtors /exec
rabin -s /exec | grep “__DTOR”

Zazwyczaj znajdziesz znaczniki DTOR pomiędzy wartościami ffffffff i 00000000. Jeśli zobaczysz tylko te wartości, oznacza to, że nie ma zarejestrowanej żadnej funkcji. Nadpisz więc 00000000 adresem shellcode, aby go wykonać.

{% hint style="warning" %} Oczywiście najpierw musisz znaleźć miejsce do przechowywania shellcode, aby później móc go wywołać. {% endhint %}

.fini_array

W zasadzie jest to struktura zawierająca funkcje, które zostaną wywołane przed zakończeniem programu, podobnie jak .dtors. Jest to interesujące, jeśli możesz wywołać swoją shellcode, skacząc do adresu, lub w przypadkach, gdy musisz wrócić do main ponownie, aby wykorzystać podatność po raz drugi.

objdump -s -j .fini_array ./greeting

./greeting:     file format elf32-i386

Contents of section .fini_array:
8049934 a0850408

#Put your address in 0x8049934

Zauważ, że gdy funkcja z .fini_array jest wykonywana, przechodzi do następnej, więc nie będzie wykonywana wielokrotnie (zapobiegając wiecznym pętlom), ale również da ci tylko 1 wykonanie funkcji umieszczonej tutaj.

Zauważ, że wpisy w .fini_array są wywoływane w odwrotnej kolejności, dlatego prawdopodobnie chcesz zacząć pisanie od ostatniego.

Wieczna pętla

Aby nadużyć .fini_array i uzyskać wieczną pętlę, możesz sprawdzić, co zostało tutaj zrobione: Jeśli masz co najmniej 2 wpisy w .fini_array, możesz:

  • Użyj swojego pierwszego zapisu, aby ponownie wywołać podatną funkcję do arbitralnego zapisu
  • Następnie oblicz adres powrotu na stosie przechowywany przez __libc_csu_fini (funkcja wywołująca wszystkie funkcje .fini_array) i umieść tam adres __libc_csu_fini
  • Spowoduje to, że __libc_csu_fini wywoła siebie ponownie, wykonując ponownie funkcje .fini_array, które ponownie wywołają podatną funkcję WWW 2 razy: raz dla arbitralnego zapisu i jeszcze raz, aby ponownie nadpisać adres powrotu __libc_csu_fini na stosie, aby ponownie wywołać siebie.

{% hint style="danger" %} Zauważ, że przy Pełnym RELRO**, sekcja .fini_array jest ustawiona jako tylko do odczytu. W nowszych wersjach, nawet przy [Częściowym RELRO], sekcja .fini_array jest również ustawiona jako tylko do odczytu. {% endhint %}

{% hint style="success" %} Dowiedz się i ćwicz Hacking AWS:HackTricks Training AWS Red Team Expert (ARTE)
Dowiedz się i ćwicz Hacking GCP: HackTricks Training GCP Red Team Expert (GRTE)

Wsparcie dla HackTricks
{% endhint %}