mirror of
https://github.com/HackTricks-wiki/hacktricks.git
synced 2025-10-10 18:36:50 +00:00
33 lines
3.9 KiB
Markdown
33 lines
3.9 KiB
Markdown
# PIE
|
||
|
||
{{#include ../../../banners/hacktricks-training.md}}
|
||
|
||
## Основна інформація
|
||
|
||
Бінарний файл, скомпільований як PIE, або **Position Independent Executable**, означає, що **програма може завантажуватися в різних місцях пам'яті** щоразу, коли вона виконується, запобігаючи жорстко закодованим адресам.
|
||
|
||
Трюк для експлуатації цих бінарних файлів полягає в експлуатації **відносних адрес** — зміщення між частинами програми залишаються незмінними, навіть якщо абсолютні місця змінюються. Щоб **обійти PIE, вам потрібно лише витікати одну адресу**, зазвичай з **стека**, використовуючи вразливості, такі як атаки форматних рядків. Як тільки у вас є адреса, ви можете обчислити інші за їхніми **фіксованими зміщеннями**.
|
||
|
||
Корисна підказка при експлуатації бінарних файлів PIE полягає в тому, що їх **базова адреса зазвичай закінчується на 000** через те, що сторінки пам'яті є одиницями рандомізації, розміром 0x1000 байт. Це вирівнювання може бути критичною **перевіркою, якщо експлуатація не працює** так, як очікувалося, вказуючи на те, чи була ідентифікована правильна базова адреса.\
|
||
Або ви можете використовувати це для вашої експлуатації, якщо ви витікаєте, що адреса знаходиться за **`0x649e1024`**, ви знаєте, що **базова адреса `0x649e1000`** і з цього ви можете просто **обчислити зміщення** функцій і місць.
|
||
|
||
## Обходи
|
||
|
||
Щоб обійти PIE, потрібно **витикувати якусь адресу завантаженого** бінарного файлу, для цього є кілька варіантів:
|
||
|
||
- **Вимкнений ASLR**: Якщо ASLR вимкнено, бінарний файл, скомпільований з PIE, завжди **буде завантажуватися за тією ж адресою**, отже, **PIE буде марним**, оскільки адреси об'єктів завжди будуть в одному і тому ж місці.
|
||
- Отримати **витік** (поширено в простих CTF завданнях, [**перевірте цей приклад**](https://ir0nstone.gitbook.io/notes/types/stack/pie/pie-exploit))
|
||
- **Брутфорсити значення EBP та EIP** у стеці, поки не витечете правильні:
|
||
|
||
{{#ref}}
|
||
bypassing-canary-and-pie.md
|
||
{{#endref}}
|
||
|
||
- Використовуйте вразливість **произвольного читання**, таку як [**форматний рядок**](../../format-strings/index.html), щоб витікати адресу бінарного файлу (наприклад, зі стека, як у попередній техніці), щоб отримати базу бінарного файлу та використовувати зміщення звідти. [**Знайдіть приклад тут**](https://ir0nstone.gitbook.io/notes/types/stack/pie/pie-bypass).
|
||
|
||
## Посилання
|
||
|
||
- [https://ir0nstone.gitbook.io/notes/types/stack/pie](https://ir0nstone.gitbook.io/notes/types/stack/pie)
|
||
|
||
{{#include ../../../banners/hacktricks-training.md}}
|