WWW2Exec - .dtors & .fini_array
Last updated
Last updated
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)
Obecnie jest bardzo dziwne znalezienie binarki z sekcją .dtors!
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ą:
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ć.
Oczywiście najpierw musisz znaleźć miejsce do przechowywania shellcode, aby później móc go wywołać.
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.
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.
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.
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.
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)