WWW2Exec - .dtors & .fini_array

Wesprzyj HackTricks

.dtors

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

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

Oczywiście najpierw musisz znaleźć miejsce do przechowywania shellcode, aby później móc go wywołać.

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

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.

Wsparcie dla HackTricks

Last updated