# 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}}