Relro

Reading time: 3 minutes

tip

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

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

Relro

RELRO означає Relocation Read-Only, і це функція безпеки, що використовується в бінарних файлах для зменшення ризиків, пов'язаних з переписуванням GOT (Global Offset Table). Існує два типи захисту RELRO: (1) Частковий RELRO і (2) Повний RELRO. Обидва вони реорганізовують GOT і BSS з ELF файлів, але з різними результатами та наслідками. Конкретно, вони розміщують секцію GOT перед BSS. Тобто, GOT знаходиться за нижчими адресами, ніж BSS, що унеможливлює переписування записів GOT шляхом переповнення змінних у BSS (пам'ять записується з нижчих адрес до вищих).

Давайте розглянемо концепцію в її двох різних типах для ясності.

Частковий RELRO

Частковий RELRO використовує простіший підхід для підвищення безпеки без значного впливу на продуктивність бінарного файлу. Частковий RELRO робить .got тільки для читання (не-PLT частина секції GOT). Майте на увазі, що решта секції (як .got.plt) все ще може бути записуваною і, отже, підлягає атакам. Це не запобігає зловживанню GOT з вразливостей довільного запису.

Примітка: За замовчуванням, GCC компілює бінарні файли з Частковим RELRO.

Повний RELRO

Повний RELRO підвищує захист, роблячи всю GOT (як .got, так і .got.plt) та секцію .fini_array повністю тільки для читання. Як тільки бінарний файл запускається, всі адреси функцій вирішуються і завантажуються в GOT, після чого GOT позначається як тільки для читання, ефективно запобігаючи будь-яким змінам під час виконання.

Однак, компроміс з Повним RELRO полягає в продуктивності та часі запуску. Оскільки потрібно вирішити всі динамічні символи під час запуску перед тим, як позначити GOT як тільки для читання, бінарні файли з увімкненим Повним RELRO можуть мати довший час завантаження. Це додаткове навантаження під час запуску є причиною, чому Повний RELRO не увімкнено за замовчуванням у всіх бінарних файлах.

Можна перевірити, чи увімкнено Повний RELRO у бінарному файлі за допомогою:

bash
readelf -l /proc/ID_PROC/exe | grep BIND_NOW

Bypass

Якщо увімкнено Full RELRO, єдиний спосіб обійти його - знайти інший спосіб, який не потребує запису в таблицю GOT для отримання довільного виконання.

Зверніть увагу, що GOT LIBC зазвичай є Partial RELRO, тому його можна змінити за допомогою довільного запису. Більше інформації в Targetting libc GOT entries.

tip

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

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