mirror of
https://github.com/carlospolop/hacktricks
synced 2024-11-24 21:53:54 +00:00
Translated ['binary-exploitation/format-strings/README.md'] to ua
This commit is contained in:
parent
5dd0333cc6
commit
78087b4490
1 changed files with 12 additions and 12 deletions
|
@ -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 %}
|
||||
|
|
Loading…
Reference in a new issue