Format Strings
Вивчайте та практикуйте AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE) Вивчайте та практикуйте GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
Основна інформація
У C printf
є функція, яка може бути використана для виведення деякого рядка. Перший параметр, який очікує ця функція, - це сирий текст з форматами. Наступні параметри, які очікуються, - це значення для заміни форматів з сирого тексту.
Інші вразливі функції - це sprintf()
та fprintf()
.
Вразливість виникає, коли текст зловмисника використовується як перший аргумент для цієї функції. Зловмисник зможе створити спеціальний вхід, зловживаючи можливостями форматного рядка printf для читання та запису будь-яких даних за будь-якою адресою (читабельною/записуваною). Таким чином, він зможе виконувати довільний код.
Формати:
Приклади:
Вразливий приклад:
Звичайне використання:
З відсутніми аргументами:
fprintf вразливий:
Доступ до вказівників
Формат %<n>$x
, де n
- це число, дозволяє вказати printf вибрати n параметр (з стеку). Тож, якщо ви хочете прочитати 4-й параметр зі стеку, використовуючи printf, ви можете зробити:
і ви б читали з першого до четвертого параметра.
Або ви могли б зробити:
і безпосередньо прочитати четвертий.
Зверніть увагу, що атакуючий контролює параметр pr
intf
, що в основному означає, що** його введення буде в стеку, коли буде викликано printf
, що означає, що він може записувати конкретні адреси пам'яті в стек.
Атакуючий, який контролює цей ввід, зможе додати довільну адресу в стек і змусити printf
отримати доступ до них. У наступному розділі буде пояснено, як використовувати цю поведінку.
Довільне Читання
Можливо використовувати форматер %n$s
, щоб змусити printf
отримати адресу, що знаходиться на n позиції, слідуючи за нею, і друкувати її так, ніби це рядок (друкувати до тих пір, поки не буде знайдено 0x00). Отже, якщо базова адреса бінарного файлу 0x8048000
, і ми знаємо, що введення користувача починається на 4-й позиції в стеці, можливо надрукувати початок бінарного файлу за допомогою:
Зверніть увагу, що ви не можете поставити адресу 0x8048000 на початку введення, оскільки рядок буде обірвано на 0x00 в кінці цієї адреси.
Знайти зсув
Щоб знайти зсув до вашого введення, ви можете надіслати 4 або 8 байтів (0x41414141
), за якими слідує %1$x
і збільшувати значення, поки не отримаєте A's
.
Last updated