Translated ['binary-exploitation/format-strings/README.md'] to ua

This commit is contained in:
Translator 2024-09-25 16:29:43 +00:00
parent 5dd0333cc6
commit 78087b4490

View file

@ -17,13 +17,13 @@
## Основна інформація
У C **`printf`** є функція, яка може бути використана для **виведення** деякого рядка. **Перший параметр**, який очікує ця функція, - це **сирий текст з форматами**. **Наступні параметри**, які очікуються, - це **значення** для **заміни** **форматів** з сирого тексту.
У C **`printf`** — це функція, яка може бути використана для **виведення** деякого рядка. **Перший параметр**, який очікує ця функція, — це **сирий текст з форматерами**. **Наступні параметри** — це **значення**, які потрібно **замінити** на **форматери** з сирого тексту.
Інші вразливі функції - це **`sprintf()`** та **`fprintf()`**.
Інші вразливі функції це **`sprintf()`** та **`fprintf()`**.
Вразливість виникає, коли **текст зловмисника використовується як перший аргумент** для цієї функції. Зловмисник зможе створити **спеціальний вхід, зловживаючи** можливостями **форматного рядка printf** для читання та **запису будь-яких даних за будь-якою адресою (читабельною/записуваною)**. Таким чином, він зможе **виконувати довільний код**.
#### Формати:
#### Форматери:
```bash
%08x —> 8 hex bytes
%d —> Entire
@ -42,7 +42,7 @@ char buffer[30];
gets(buffer); // Dangerous: takes user input without restrictions.
printf(buffer); // If buffer contains "%x", it reads from the stack.
```
* Звичайне використання:
* Нормальне використання:
```c
int value = 1205;
printf("%x %x %x", value, value, value); // Outputs: 4b5 4b5 4b5
@ -59,7 +59,7 @@ int main(int argc, char *argv[]) {
char *user_input;
user_input = argv[1];
FILE *output_file = fopen("output.txt", "w");
fprintf(output_file, user_input); // The user input cna include formatters!
fprintf(output_file, user_input); // The user input can include formatters!
fclose(output_file);
return 0;
}
@ -78,15 +78,15 @@ printf("$4%x")
```
і безпосередньо прочитати четвертий.
Зверніть увагу, що атакуючий контролює параметр `pr`**`intf`**, що в основному означає, що** його введення буде в стеку, коли буде викликано `printf`, що означає, що він може записувати конкретні адреси пам'яті в стек.
Зверніть увагу, що зловмисник контролює параметр `pr`**`intf`**, що в основному означає, що його введення буде в стеку, коли викликається `printf`, що означає, що він може записувати конкретні адреси пам'яті в стек.
{% hint style="danger" %}
Атакуючий, який контролює цей ввід, зможе **додати довільну адресу в стек і змусити `printf` отримати доступ до них**. У наступному розділі буде пояснено, як використовувати цю поведінку.
Зловмисник, який контролює цей ввід, зможе **додати довільну адресу в стек і змусити `printf` отримати до них доступ**. У наступному розділі буде пояснено, як використовувати цю поведінку.
{% endhint %}
## **Довільне Читання**
Можливо використовувати форматер **`%n$s`**, щоб змусити **`printf`** отримати **адресу**, що знаходиться на **n позиції**, слідуючи за нею, і **друкувати її так, ніби це рядок** (друкувати до тих пір, поки не буде знайдено 0x00). Отже, якщо базова адреса бінарного файлу **`0x8048000`**, і ми знаємо, що введення користувача починається на 4-й позиції в стеці, можливо надрукувати початок бінарного файлу за допомогою:
Можливо використовувати форматер **`%n$s`**, щоб змусити **`printf`** отримати **адресу**, що знаходиться на **n позиції**, слідуючи за нею, і **друкувати її так, ніби це рядок** (друкувати до тих пір, поки не буде знайдено 0x00). Отже, якщо базова адреса бінарного файлу **`0x8048000`**, і ми знаємо, що введення користувача починається з 4-ї позиції в стеці, можливо надрукувати початок бінарного файлу за допомогою:
```python
from pwn import *
@ -167,7 +167,7 @@ AAAA.%500\$08x —> Param at offset 500
{% endcontent-ref %}
Ми будемо **перезаписувати** **функцію**, яка **отримує** свої **аргументи** від **користувача** і **вказує** на **функцію** **`system`**.\
Як згадувалося, для запису адреси зазвичай потрібно 2 кроки: спочатку **записуються 2 байти** адреси, а потім інші 2. Для цього використовується **`$hn`**.
Як згадувалося, для запису адреси зазвичай потрібно 2 кроки: спочатку **записується 2 байти** адреси, а потім інші 2. Для цього використовується **`$hn`**.
* **HOB** викликається для 2 вищих байтів адреси
* **LOB** викликається для 2 нижчих байтів адреси
@ -188,7 +188,7 @@ python -c 'print "\x26\x97\x04\x08"+"\x24\x97\x04\x08"+ "%.49143x" + "%4$hn" + "
```
{% endcode %}
### Pwntools Шаблон
### Шаблон Pwntools
Ви можете знайти **шаблон** для підготовки експлойту для цього типу вразливості в:
@ -229,7 +229,7 @@ p.interactive()
* [https://guyinatuxedo.github.io/10-fmt\_strings/backdoor17\_bbpwn/index.html](https://guyinatuxedo.github.io/10-fmt\_strings/backdoor17\_bbpwn/index.html)
* 32 біт, relro, без canary, nx, без pie, форматний рядок для перезапису адреси `fflush` з функцією win (ret2win)
* [https://guyinatuxedo.github.io/10-fmt\_strings/tw16\_greeting/index.html](https://guyinatuxedo.github.io/10-fmt\_strings/tw16\_greeting/index.html)
* 32 біт, relro, без canary, nx, без pie, форматний рядок для запису адреси всередині main в `.fini_array` (щоб потік повертався ще раз) і запису адреси до `system` в таблиці GOT, що вказує на `strlen`. Коли потік повертається до main, `strlen` виконується з введенням користувача і вказує на `system`, він виконає передані команди.
* 32 біт, relro, без canary, nx, без pie, форматний рядок для запису адреси всередині main в `.fini_array` (щоб потік повертався ще раз) та запису адреси до `system` в таблиці GOT, що вказує на `strlen`. Коли потік повертається до main, `strlen` виконується з введенням користувача і вказує на `system`, він виконає передані команди.
{% hint style="success" %}
Вчіть та практикуйте Hacking AWS:<img src="/.gitbook/assets/arte.png" alt="" data-size="line">[**HackTricks Training AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="/.gitbook/assets/arte.png" alt="" data-size="line">\
@ -241,7 +241,7 @@ p.interactive()
* Перевірте [**плани підписки**](https://github.com/sponsors/carlospolop)!
* **Приєднуйтесь до** 💬 [**групи Discord**](https://discord.gg/hRep4RUj7f) або [**групи telegram**](https://t.me/peass) або **слідкуйте** за нами в **Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
* **Діліться хакерськими трюками, подаючи PR до** [**HackTricks**](https://github.com/carlospolop/hacktricks) та [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) репозиторіїв на github.
* **Діліться хакерськими трюками, надсилаючи PR до** [**HackTricks**](https://github.com/carlospolop/hacktricks) та [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) репозиторіїв на github.
</details>
{% endhint %}