PIE
Основна інформація
Бінарний файл, скомпільований як PIE, або Position Independent Executable, означає, що програма може завантажуватися в різні місця пам'яті кожного разу при виконанні, запобігаючи захардкодженим адресам.
Суть взлому цих бінарних файлів полягає в експлуатації відносних адрес—зсуви між частинами програми залишаються тими ж, навіть якщо абсолютні місця змінюються. Для обхіду PIE вам потрібно витікти одну адресу, зазвичай з стеку, використовуючи вразливості, такі як атаки формату рядка. Як тільки у вас є адреса, ви можете обчислити інші за їх фіксованими зсувами.
Корисним підказкою при взломі бінарних файлів PIE є те, що їх базова адреса, як правило, закінчується на 000 через те, що сторінки пам'яті є одиницями випадкового розташування, розміром 0x1000 байтів. Це вирішальний перевірка, якщо експлойт не працює як очікувалося, вказуючи, чи була ідентифікована правильна базова адреса.
Або ви можете використовувати це для свого експлойту, якщо ви витікаєте, що адреса знаходиться за 0x649e1024
, ви знаєте, що базова адреса - 0x649e1000
, і звідти ви можете просто обчислити зсуви функцій та місць.
Обхід
Для обходу PIE потрібно витікти деяку адресу завантаженого бінарного файлу, є кілька варіантів для цього:
ASLR вимкнено: Якщо ASLR вимкнено, бінарний файл, скомпільований з PIE, завжди буде завантажуватися в одну адресу, тому PIE буде некорисним, оскільки адреси об'єктів завжди будуть в одному місці.
Отримати витік (звичайно в простих завданнях CTF, перевірте цей приклад)
Перебор EBP та значень EIP на стеку, поки ви не витікаєте правильні:
Використовуйте вразливість довільного читання, таку як формат рядка, щоб витікти адресу бінарного файлу (наприклад, зі стеку, як у попередній техніці), щоб отримати базу бінарного файлу та використовувати зсуви звідти. Знайдіть приклад тут.
Посилання
Last updated