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

This commit is contained in:
Translator 2024-09-25 16:48:51 +00:00
parent bbc32aecf5
commit 9991d5d4b7

View file

@ -17,13 +17,13 @@
## Основна інформація
У C **`printf`** є функція, яка може бути використана для **виведення** деякого рядка. **Перший параметр**, який очікує ця функція, - це **сирий текст з форматами**. **Наступні параметри**, які очікуються, - це **значення** для **заміни** **форматів** з сирого тексту.
У C **`printf`** - це функція, яка може бути використана для **виведення** деякого рядка. **Перший параметр**, який очікує ця функція, - це **сирий текст з форматерами**. **Наступні параметри** - це **значення**, які потрібно **замінити** на **форматери** з сирого тексту.
Інші вразливі функції - це **`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
@ -78,15 +78,15 @@ printf("%4$x")
```
і безпосередньо прочитати четвертий.
Зверніть увагу, що атакуючий контролює параметр `pr`**`intf`**, що в основному означає, що** його введення буде в стеку, коли буде викликано `printf`, що означає, що він може записувати конкретні адреси пам'яті в стек.
Зверніть увагу, що атакуючий контролює параметр `printf`, **що в основному означає, що** його введення буде в стеку, коли викликається `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 *
@ -105,7 +105,7 @@ log.info(p.clean()) # b'\x7fELF\x01\x01\x01||||'
### Знайти зсув
Щоб знайти зсув до вашого введення, ви можете надіслати 4 або 8 байтів (`0x41414141`), за якими слідує **`%1$x`** і **збільшувати** значення, поки не отримаєте `A's`.
Щоб знайти зсув до вашого введення, ви можете надіслати 4 або 8 байтів (`0x41414141`), за якими слідує **`%1$x`** і **збільшити** значення, поки не отримаєте `A's`.
<details>
@ -149,7 +149,7 @@ p.close()
## **Випадкове записування**
Форматер **`$<num>%n`** **записує** **кількість записаних байтів** за **вказаною адресою** в параметрі \<num> у стеку. Якщо зловмисник може записати стільки символів, скільки захоче, за допомогою printf, він зможе змусити **`$<num>%n`** записати випадкове число за випадковою адресою.
Форматер **`%<num>$n`** **записує** **кількість записаних байтів** за **вказаною адресою** в параметрі \<num> у стеку. Якщо зловмисник може записати стільки символів, скільки захоче, використовуючи printf, він зможе змусити **`%<num>$n`** записати випадкове число за випадковою адресою.
На щастя, щоб записати число 9999, не потрібно додавати 9999 "A" до введення, для цього можна використовувати форматер **`%.<num-write>%<num>$n`**, щоб записати число **`<num-write>`** за **адресою, на яку вказує позиція `num`**.
```bash
@ -172,7 +172,7 @@ AAAA.%500\$08x —> Param at offset 500
* **HOB** викликається для 2 вищих байтів адреси
* **LOB** викликається для 2 нижчих байтів адреси
Потім, через те, як працює формат рядка, вам потрібно **спочатку записати найменший** з \[HOB, LOB\], а потім інший.
Потім, через те, як працює формат рядка, вам потрібно **спочатку записати найменший** з \[HOB, LOB\] і потім інший.
Якщо HOB < LOB\
`[address+2][address]%.[HOB-8]x%[offset]\$hn%.[LOB-HOB]x%[offset+1]`
@ -188,7 +188,7 @@ python -c 'print "\x26\x97\x04\x08"+"\x24\x97\x04\x08"+ "%.49143x" + "%4$hn" + "
```
{% endcode %}
### Pwntools Template
### Шаблон Pwntools
Ви можете знайти **шаблон** для підготовки експлойту для цього типу вразливості в:
@ -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 %}