mirror of
https://github.com/HackTricks-wiki/hacktricks.git
synced 2025-10-10 18:36:50 +00:00
53 lines
4.5 KiB
Markdown
53 lines
4.5 KiB
Markdown
# WWW2Exec - .dtors & .fini_array
|
||
|
||
{{#include ../../banners/hacktricks-training.md}}
|
||
|
||
## .dtors
|
||
|
||
> [!CAUTION]
|
||
> Сьогодні дуже **незвично знайти бінарний файл з секцією .dtors!**
|
||
|
||
Деструктори - це функції, які **виконуються перед завершенням програми** (після повернення функції `main`).\
|
||
Адреси цих функцій зберігаються в секції **`.dtors`** бінарного файлу, і тому, якщо вам вдасться **записати** **адресу** в **shellcode** в **`__DTOR_END__`**, це буде **виконано** перед завершенням програми.
|
||
|
||
Отримайте адресу цієї секції за допомогою:
|
||
```bash
|
||
objdump -s -j .dtors /exec
|
||
rabin -s /exec | grep “__DTOR”
|
||
```
|
||
Зазвичай ви знайдете маркери **DTOR** **між** значеннями `ffffffff` та `00000000`. Тож, якщо ви просто бачите ці значення, це означає, що **функція не зареєстрована**. Тож **перезапишіть** **`00000000`** адресою до **shellcode**, щоб виконати його.
|
||
|
||
> [!WARNING]
|
||
> Звичайно, спочатку вам потрібно знайти **місце для зберігання shellcode**, щоб пізніше викликати його.
|
||
|
||
## **.fini_array**
|
||
|
||
По суті, це структура з **функціями, які будуть викликані** перед завершенням програми, як **`.dtors`**. Це цікаво, якщо ви можете викликати свій **shellcode, просто стрибнувши до адреси**, або в випадках, коли вам потрібно знову **повернутися до `main`**, щоб **використати вразливість вдруге**.
|
||
```bash
|
||
objdump -s -j .fini_array ./greeting
|
||
|
||
./greeting: file format elf32-i386
|
||
|
||
Contents of section .fini_array:
|
||
8049934 a0850408
|
||
|
||
#Put your address in 0x8049934
|
||
```
|
||
Зверніть увагу, що коли функція з **`.fini_array`** виконується, вона переходить до наступної, тому вона не буде виконуватися кілька разів (запобігаючи вічним циклам), але також вона надасть лише 1 **виконання функції**, розміщеної тут.
|
||
|
||
Зверніть увагу, що записи в **`.fini_array`** викликаються в **оберненому** порядку, тому вам, ймовірно, слід почати записувати з останнього.
|
||
|
||
#### Вічний цикл
|
||
|
||
Щоб зловживати **`.fini_array`** для отримання вічного циклу, ви можете [**перевірити, що було зроблено тут**](https://guyinatuxedo.github.io/17-stack_pivot/insomnihack18_onewrite/index.html)**:** Якщо у вас є принаймні 2 записи в **`.fini_array`**, ви можете:
|
||
|
||
- Використати ваше перше записування, щоб знову **викликати вразливу функцію довільного запису**
|
||
- Потім обчислити адресу повернення в стеку, збережену **`__libc_csu_fini`** (функція, яка викликає всі функції з **`.fini_array`**) і помістити туди **адресу `__libc_csu_fini`**
|
||
- Це змусить **`__libc_csu_fini`** знову викликати себе, виконуючи функції **`.fini_array`** знову, що викличе вразливу WWW функцію 2 рази: один раз для **довільного запису** і ще один раз, щоб знову перезаписати **адресу повернення `__libc_csu_fini`** в стеку, щоб знову викликати себе.
|
||
|
||
> [!CAUTION]
|
||
> Зверніть увагу, що з [**Full RELRO**](../common-binary-protections-and-bypasses/relro.md)**,** секція **`.fini_array`** стає **тільки для читання**.
|
||
> У новіших версіях, навіть з [**Partial RELRO**], секція **`.fini_array`** також стає **тільки для читання**.
|
||
|
||
{{#include ../../banners/hacktricks-training.md}}
|