6.2 KiB
Relro
{% hint style="success" %}
Learn & practice AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Learn & practice GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
Support HackTricks
- Check the subscription plans!
- Join the 💬 Discord group or the telegram group or follow us on Twitter 🐦 @hacktricks_live.
- Share hacking tricks by submitting PRs to the HackTricks and HackTricks Cloud github repos.
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.
{% hint style="success" %}
Learn & practice AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Learn & practice GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
Support HackTricks
- Check the subscription plans!
- Join the 💬 Discord group or the telegram group or follow us on Twitter 🐦 @hacktricks_live.
- Share hacking tricks by submitting PRs to the HackTricks and HackTricks Cloud github repos.