WWW2Exec - .dtors & .fini_array

Reading time: 3 minutes

tip

Вивчайте та практикуйте AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Вивчайте та практикуйте GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)

Підтримайте HackTricks

.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 для отримання вічного циклу, ви можете перевірити, що було зроблено тут: Якщо у вас є принаймні 2 записи в .fini_array, ви можете:

  • Використати ваше перше записування, щоб знову викликати вразливу функцію довільного запису
  • Потім обчислити адресу повернення в стеку, збережену __libc_csu_fini (функція, яка викликає всі функції з .fini_array) і помістити туди адресу __libc_csu_fini
  • Це змусить __libc_csu_fini знову викликати себе, виконуючи функції .fini_array знову, що викличе вразливу WWW функцію 2 рази: один раз для довільного запису і ще один раз, щоб знову перезаписати адресу повернення __libc_csu_fini в стеку, щоб знову викликати себе.

caution

Зверніть увагу, що з Full RELRO, секція .fini_array стає тільки для читання. У новіших версіях, навіть з [Partial RELRO], секція .fini_array також стає тільки для читання.

tip

Вивчайте та практикуйте AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Вивчайте та практикуйте GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)

Підтримайте HackTricks