# WWW2Exec - .dtors & .fini_array {{#include ../../banners/hacktricks-training.md}} ## .dtors > [!CAUTION] > Obecnie bardzo **dziwne jest znalezienie binarnego pliku 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`** binarnego pliku, a zatem, jeśli uda ci się **zapisać** **adres** do **shellcode** w **`__DTOR_END__`**, to zostanie on **wykonany** przed zakończeniem programu. Uzyskaj adres tej sekcji za pomocą: ```bash objdump -s -j .dtors /exec rabin -s /exec | grep “__DTOR” ``` Zazwyczaj znajdziesz znaczniki **DTOR** **pomiędzy** wartościami `ffffffff` i `00000000`. Więc jeśli widzisz tylko te wartości, oznacza to, że **nie ma zarejestrowanej funkcji**. Więc **nadpisz** **`00000000`** adresem do **shellcode**, aby go wykonać. > [!WARNING] > Oczywiście, najpierw musisz znaleźć **miejsce na przechowanie shellcode**, aby później móc go wywołać. ## **.fini_array** Zasadniczo jest to struktura z **funkcjami, które będą wywoływane** przed zakończeniem programu, jak **`.dtors`**. To jest interesujące, jeśli możesz wywołać swój **shellcode, po prostu skacząc do adresu**, lub w przypadkach, gdy musisz wrócić do **`main`**, aby **wykorzystać lukę po raz drugi**. ```bash 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 kilka razy (zapobiegając wiecznym pętlom), ale także da tylko 1 **wykonanie funkcji** umieszczonej tutaj. Zauważ, że wpisy w **`.fini_array`** są wywoływane w **odwrotnej** kolejności, więc prawdopodobnie chcesz zacząć pisać od ostatniego. #### Wieczna pętla Aby wykorzystać **`.fini_array`** do uzyskania wiecznej pętli, możesz [**sprawdzić, co zrobiono tutaj**](https://guyinatuxedo.github.io/17-stack_pivot/insomnihack18_onewrite/index.html)**:** Jeśli masz co najmniej 2 wpisy w **`.fini_array`**, możesz: - Użyć swojego pierwszego zapisu, aby **ponownie wywołać podatną funkcję do dowolnego zapisu** - Następnie obliczyć adres powrotu na stosie przechowywany przez **`__libc_csu_fini`** (funkcję, która wywołuje wszystkie funkcje z **`.fini_array`**) i umieścić tam **adres `__libc_csu_fini`** - To spowoduje, że **`__libc_csu_fini`** wywoła się ponownie, wykonując funkcje **`.fini_array`** ponownie, co spowoduje wywołanie podatnej funkcji WWW 2 razy: raz dla **dowolnego zapisu** i jeszcze raz, aby ponownie nadpisać **adres powrotu `__libc_csu_fini`** na stosie, aby ponownie się wywołać. > [!CAUTION] > Zauważ, że przy [**Full RELRO**](../common-binary-protections-and-bypasses/relro.md)**,** sekcja **`.fini_array`** jest ustawiona na **tylko do odczytu**. > W nowszych wersjach, nawet przy [**Partial RELRO**] sekcja **`.fini_array`** jest również ustawiona na **tylko do odczytu**. {{#include ../../banners/hacktricks-training.md}}