4.1 KiB
Relro
{{#include ../../banners/hacktricks-training.md}}
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 у бінарному файлі за допомогою:
readelf -l /proc/ID_PROC/exe | grep BIND_NOW
Bypass
Якщо увімкнено Full RELRO, єдиний спосіб обійти його - знайти інший спосіб, який не потребує запису в таблицю GOT для отримання довільного виконання.
Зверніть увагу, що GOT LIBC зазвичай є Partial RELRO, тому його можна змінити за допомогою довільного запису. Більше інформації в Targetting libc GOT entries.
{{#include ../../banners/hacktricks-training.md}}