hacktricks/binary-exploitation/common-binary-protections-and-bypasses/relro.md

3.1 KiB
Raw Blame History

Relro

Relro

RELRO означає Relocation Read-Only і це функція безпеки, яка використовується в двійкових файлах для зменшення ризиків, пов'язаних з перезаписами GOT (Global Offset Table). Розглянемо концепцію у двох відмінних типах для ясності: Partial RELRO та Full RELRO.

Partial RELRO

Partial RELRO використовує простіший підхід для підвищення безпеки без значного впливу на продуктивність двійкового файлу. Розмістивши GOT вище змінних програми в пам'яті, Partial RELRO спрямований на запобігання переповнення буфера до досягнення та порушення GOT.

Це не заважає використанню GOT з довільним записом уразливостей.

Full RELRO

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

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

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

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

Обхід

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

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