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