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

28 lines
3.1 KiB
Markdown
Raw Normal View 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** у двійковому файлі за допомогою:
```bash
readelf -l /proc/ID_PROC/exe | grep BIND_NOW
```
## Обхід
Якщо ввімкнено повний RELRO, єдиний спосіб обійти його - знайти інший спосіб, який не потребує запису в таблицю GOT для отримання довільного виконання.
Зверніть увагу, що **GOT бібліотеки LIBC зазвичай має частковий RELRO**, тому його можна змінити за допомогою довільного запису. Додаткова інформація в [Targetting libc GOT entries](https://github.com/nobodyisnobody/docs/blob/main/code.execution.on.last.libc/README.md#1---targetting-libc-got-entries).