3.9 KiB
PIE
{{#include ../../../../banners/hacktricks-training.md}}
Basic Information
Бінарний файл, скомпільований як PIE, або Position Independent Executable, означає, що програма може завантажуватися в різних місцях пам'яті щоразу, коли вона виконується, запобігаючи жорстко закодованим адресам.
Трюк для експлуатації цих бінарних файлів полягає в експлуатації відносних адрес — зміщення між частинами програми залишаються незмінними, навіть якщо абсолютні місця змінюються. Щоб обійти PIE, вам потрібно лише витікати одну адресу, зазвичай з стека, використовуючи вразливості, такі як атаки форматних рядків. Як тільки ви отримали адресу, ви можете обчислити інші за їхніми фіксованими зміщеннями.
Корисна підказка при експлуатації бінарних файлів PIE полягає в тому, що їх базова адреса зазвичай закінчується на 000 через те, що сторінки пам'яті є одиницями рандомізації, розміром 0x1000 байт. Це вирівнювання може бути критичною перевіркою, якщо експлуатація не працює так, як очікувалося, вказуючи на те, чи була ідентифікована правильна базова адреса.
Або ви можете використовувати це для вашої експлуатації, якщо ви витікаєте, що адреса знаходиться за 0x649e1024
, ви знаєте, що базова адреса 0x649e1000
і з цього ви можете просто обчислити зміщення функцій і місць.
Bypasses
Щоб обійти PIE, потрібно витикувати якусь адресу завантаженого бінарного файлу, для цього є кілька варіантів:
- Вимкнений ASLR: Якщо ASLR вимкнено, бінарний файл, скомпільований з PIE, завжди буде завантажуватися за тією ж адресою, отже, PIE буде марним, оскільки адреси об'єктів завжди будуть в одному і тому ж місці.
- Отримати витік (поширено в простих CTF завданнях, перевірте цей приклад)
- Брутфорсити значення EBP та EIP у стеці, поки не витечете правильні:
{{#ref}} bypassing-canary-and-pie.md {{#endref}}
- Використовуйте вразливість довільного читання, таку як форматний рядок, щоб витікати адресу бінарного файлу (наприклад, зі стека, як у попередній техніці), щоб отримати базу бінарного файлу та використовувати зміщення звідти. Знайдіть приклад тут.
References
{{#include ../../../../banners/hacktricks-training.md}}