mirror of
https://github.com/HackTricks-wiki/hacktricks.git
synced 2025-10-10 18:36:50 +00:00
53 lines
3.0 KiB
Markdown
53 lines
3.0 KiB
Markdown
# 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}}
|