WWW2Exec - .dtors & .fini_array
Last updated
Last updated
Learn & practice AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE) Learn & practice GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
Сьогодні дуже незвично знайти бінарний файл з секцією .dtors!
Деструктори - це функції, які виконуються перед завершенням програми (після повернення функції main
).
Адреси цих функцій зберігаються в .dtors
секції бінарного файлу, і тому, якщо вам вдасться записати адресу в shellcode в __DTOR_END__
, вона буде виконана перед завершенням програми.
Отримайте адресу цієї секції за допомогою:
Зазвичай ви знайдете маркери DTOR між значеннями ffffffff
та 00000000
. Тож, якщо ви просто бачите ці значення, це означає, що функція не зареєстрована. Тож перезапишіть 00000000
адресою до shellcode, щоб виконати його.
Звичайно, спочатку вам потрібно знайти місце для зберігання shellcode, щоб пізніше викликати його.
По суті, це структура з функціями, які будуть викликані перед завершенням програми, як .dtors
. Це цікаво, якщо ви можете викликати свій shellcode, просто стрибнувши до адреси, або в випадках, коли вам потрібно знову повернутися до main
, щоб використати вразливість вдруге.
Зверніть увагу, що коли виконується функція з .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
в стеку, щоб знову викликати себе.
Зверніть увагу, що з Full RELRO, секція .fini_array
стає тільки для читання. В новіших версіях, навіть з [Partial RELRO], секція .fini_array
також стає тільки для читання.
Вивчайте та практикуйте AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE) Вивчайте та практикуйте GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)