# WWW2Exec - .dtors & .fini_array {{#include ../../banners/hacktricks-training.md}} ## .dtors > [!CAUTION] > Danas je veoma **čudno pronaći binarni fajl sa .dtors sekcijom!** Destruktori su funkcije koje se **izvršavaju pre nego što program završi** (nakon što `main` funkcija vrati).\ Adrese ovih funkcija se čuvaju unutar **`.dtors`** sekcije binarnog fajla i stoga, ako uspete da **napišete** **adresu** u **shellcode** u **`__DTOR_END__`**, to će biti **izvršeno** pre nego što program završi. Dobijte adresu ove sekcije sa: ```bash objdump -s -j .dtors /exec rabin -s /exec | grep “__DTOR” ``` Obično ćete pronaći **DTOR** oznake **između** vrednosti `ffffffff` i `00000000`. Dakle, ako samo vidite te vrednosti, to znači da **nema registrovane funkcije**. Tako **prepišite** **`00000000`** sa **adresom** do **shellcode** da biste ga izvršili. > [!WARNING] > Naravno, prvo morate pronaći **mesto za skladištenje shellcode** kako biste ga kasnije pozvali. ## **.fini_array** U suštini, ovo je struktura sa **funkcijama koje će biti pozvane** pre nego što program završi, poput **`.dtors`**. Ovo je zanimljivo ako možete pozvati svoj **shellcode jednostavno skakanjem na adresu**, ili u slučajevima kada treba da se **vratite na `main`** ponovo da biste **iskoristili ranjivost drugi put**. ```bash objdump -s -j .fini_array ./greeting ./greeting: file format elf32-i386 Contents of section .fini_array: 8049934 a0850408 #Put your address in 0x8049934 ``` Napomena da kada se funkcija iz **`.fini_array`** izvrši, prelazi se na sledeću, tako da se neće izvršavati više puta (sprečavanje večitih petlji), ali će takođe dati samo 1 **izvršenje funkcije** postavljene ovde. Napomena da se unosi u **`.fini_array`** pozivaju u **obrnutom** redosledu, tako da verovatno želite da počnete da pišete od poslednjeg. #### Večna petlja Da biste iskoristili **`.fini_array`** za dobijanje večite petlje, možete [**proveriti šta je ovde urađeno**](https://guyinatuxedo.github.io/17-stack_pivot/insomnihack18_onewrite/index.html)**:** Ako imate najmanje 2 unosa u **`.fini_array`**, možete: - Iskoristiti svoje prvo pisanje da ponovo **pozovete ranjivu funkciju za proizvoljno pisanje** - Zatim, izračunati adresu povratka na steku koju čuva **`__libc_csu_fini`** (funkcija koja poziva sve funkcije iz **`.fini_array`**) i staviti tamo **adresu `__libc_csu_fini`** - Ovo će učiniti da **`__libc_csu_fini`** ponovo pozove sebe izvršavajući funkcije iz **`.fini_array`** ponovo, što će pozvati ranjivu WWW funkciju 2 puta: jednom za **proizvoljno pisanje** i još jednom da ponovo prepiše **adresu povratka `__libc_csu_fini`** na steku da bi se ponovo pozvao. > [!CAUTION] > Napomena da sa [**Full RELRO**](../common-binary-protections-and-bypasses/relro.md)**,** sekcija **`.fini_array`** je postavljena na **samo za čitanje**. > U novijim verzijama, čak i sa [**Partial RELRO**] sekcija **`.fini_array`** je takođe postavljena na **samo za čitanje**. {{#include ../../banners/hacktricks-training.md}}