mirror of
https://github.com/carlospolop/hacktricks
synced 2024-11-26 06:30:37 +00:00
28 lines
3.1 KiB
Markdown
28 lines
3.1 KiB
Markdown
|
# 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).
|