WWW2Exec - .dtors & .fini_array
Last updated
Last updated
Вивчайте та практикуйте взлом AWS: Навчання HackTricks AWS Red Team Expert (ARTE) Вивчайте та практикуйте взлом GCP: Навчання HackTricks 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:Навчання HackTricks AWS Red Team Expert (ARTE) Вивчайте та практикуйте взлом GCP: Навчання HackTricks GCP Red Team Expert (GRTE)