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
- Sprawdź plany subskrypcyjne!
- Dołącz do 💬 grupy Discord lub grupy telegramowej lub śledź nas na Twitterze 🐦 @hacktricks_live.
- Dziel się trikami hakerskimi, przesyłając PR-y do HackTricks i HackTricks Cloud repozytoriów na GitHubie.
.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
- Sprawdź plany subskrypcyjne!
- Dołącz do 💬 Grupy Discord lub grupy telegramowej lub śledź nas na Twitterze 🐦 @hacktricks_live.
- Udostępnij sztuczki hakerskie, przesyłając PR-y do HackTricks i HackTricks Cloud na githubie.