WWW2Exec - .dtors & .fini_array

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

.dtors

У наш час дуже дивно знайти бінарний файл з розділом .dtors!

Деструктори - це функції, які виконуються перед завершенням програми (після повернення функції main). Адреси цих функцій зберігаються в середині розділу .dtors бінарного файлу, тому, якщо ви зможете записати адресу вашого shellcode в __DTOR_END__, цей код буде виконаний перед завершенням програми.

Отримайте адресу цього розділу за допомогою:

objdump -s -j .dtors /exec
rabin -s /exec | grep “__DTOR”

Зазвичай ви знайдете маркери DTOR між значеннями ffffffff та 00000000. Так що, якщо ви просто бачите ці значення, це означає, що жодна функція не зареєстрована. Тому перезапишіть 00000000 адресою shellcode, щоб виконати його.

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

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

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

Last updated