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
- Перевірте плани підписки!
- Приєднуйтесь до 💬 групи Discord або групи telegram або слідкуйте за нами в Twitter 🐦 @hacktricks_live.
- Діліться хакерськими трюками, надсилаючи PR до HackTricks та HackTricks Cloud репозиторіїв на github.
.dtors
caution
Сьогодні дуже незвично знайти бінарний файл з секцією .dtors!
Деструктори - це функції, які виконуються перед завершенням програми (після повернення функції main
).
Адреси цих функцій зберігаються в секції .dtors
бінарного файлу, і тому, якщо вам вдасться записати адресу в shellcode в __DTOR_END__
, це буде виконано перед завершенням програми.
Отримайте адресу цієї секції за допомогою:
objdump -s -j .dtors /exec
rabin -s /exec | grep “__DTOR”
Зазвичай ви знайдете маркери DTOR між значеннями ffffffff
та 00000000
. Тож, якщо ви просто бачите ці значення, це означає, що функція не зареєстрована. Тож перезапишіть 00000000
адресою до shellcode, щоб виконати його.
warning
Звичайно, спочатку вам потрібно знайти місце для зберігання shellcode, щоб пізніше викликати його.
.fini_array
По суті, це структура з функціями, які будуть викликані перед завершенням програми, як .dtors
. Це цікаво, якщо ви можете викликати свій shellcode, просто стрибнувши до адреси, або в випадках, коли вам потрібно знову повернутися до main
, щоб використати вразливість вдруге.
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
- Перевірте плани підписки!
- Приєднуйтесь до 💬 групи Discord або групи telegram або слідкуйте за нами в Twitter 🐦 @hacktricks_live.
- Діліться хакерськими трюками, надсилаючи PR до HackTricks та HackTricks Cloud репозиторіїв на github.