mirror of
https://github.com/carlospolop/hacktricks
synced 2024-11-25 06:00:40 +00:00
Translated ['binary-exploitation/format-strings/README.md'] to cn
This commit is contained in:
parent
79e57fed00
commit
8e1c9a4687
1 changed files with 12 additions and 12 deletions
|
@ -9,19 +9,19 @@
|
||||||
<summary>支持 HackTricks</summary>
|
<summary>支持 HackTricks</summary>
|
||||||
|
|
||||||
* 查看 [**订阅计划**](https://github.com/sponsors/carlospolop)!
|
* 查看 [**订阅计划**](https://github.com/sponsors/carlospolop)!
|
||||||
* **加入** 💬 [**Discord 群组**](https://discord.gg/hRep4RUj7f) 或 [**Telegram 群组**](https://t.me/peass) 或 **在** **Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)** 上关注我们。**
|
* **加入** 💬 [**Discord 群组**](https://discord.gg/hRep4RUj7f) 或 [**Telegram 群组**](https://t.me/peass) 或 **关注** 我们的 **Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
|
||||||
* **通过向** [**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 仓库提交 PR 分享黑客技巧。
|
||||||
|
|
||||||
</details>
|
</details>
|
||||||
{% endhint %}
|
{% endhint %}
|
||||||
|
|
||||||
## 基本信息
|
## 基本信息
|
||||||
|
|
||||||
在 C 中,**`printf`** 是一个可以用来 **打印** 字符串的函数。该函数期望的 **第一个参数** 是 **带格式的原始文本**。后续的 **参数** 是期望的 **值**,用于 **替换** 原始文本中的 **格式化符**。
|
在 C 中,**`printf`** 是一个可以用来 **打印** 字符串的函数。该函数期望的 **第一个参数** 是 **带格式的原始文本**。后续的 **参数** 是 **替代** 原始文本中 **格式化符** 的 **值**。
|
||||||
|
|
||||||
其他易受攻击的函数包括 **`sprintf()`** 和 **`fprintf()`**。
|
其他易受攻击的函数包括 **`sprintf()`** 和 **`fprintf()`**。
|
||||||
|
|
||||||
当 **攻击者的文本作为该函数的第一个参数** 时,就会出现漏洞。攻击者将能够构造一个 **特殊输入,利用** **printf 格式** 字符串的能力来读取和 **写入任何地址(可读/可写)** 中的任何数据。这样就能够 **执行任意代码**。
|
当 **攻击者的文本作为该函数的第一个参数** 时,就会出现漏洞。攻击者将能够构造一个 **特殊输入,利用** **printf 格式** 字符串的能力来读取和 **写入任何地址(可读/可写)** 中的 **任何数据**。这样就能够 **执行任意代码**。
|
||||||
|
|
||||||
#### 格式化符:
|
#### 格式化符:
|
||||||
```bash
|
```bash
|
||||||
|
@ -78,7 +78,7 @@ printf("%4$x")
|
||||||
```
|
```
|
||||||
并直接读取第四个。
|
并直接读取第四个。
|
||||||
|
|
||||||
注意,攻击者控制了 `pr`**`intf` 参数,这基本上意味着** 他的输入将在调用 `printf` 时位于栈中,这意味着他可以在栈中写入特定的内存地址。
|
注意,攻击者控制了 `printf` **参数,这基本上意味着** 他的输入将在调用 `printf` 时位于栈中,这意味着他可以在栈中写入特定的内存地址。
|
||||||
|
|
||||||
{% hint style="danger" %}
|
{% hint style="danger" %}
|
||||||
控制此输入的攻击者将能够 **在栈中添加任意地址并使 `printf` 访问它们**。在下一节中将解释如何利用这种行为。
|
控制此输入的攻击者将能够 **在栈中添加任意地址并使 `printf` 访问它们**。在下一节中将解释如何利用这种行为。
|
||||||
|
@ -100,7 +100,7 @@ p.sendline(payload)
|
||||||
log.info(p.clean()) # b'\x7fELF\x01\x01\x01||||'
|
log.info(p.clean()) # b'\x7fELF\x01\x01\x01||||'
|
||||||
```
|
```
|
||||||
{% hint style="danger" %}
|
{% hint style="danger" %}
|
||||||
请注意,您不能将地址 0x8048000 放在输入的开头,因为字符串将在该地址的末尾以 0x00 结束。
|
注意,您不能将地址 0x8048000 放在输入的开头,因为字符串将在该地址的末尾以 0x00 结束。
|
||||||
{% endhint %}
|
{% endhint %}
|
||||||
|
|
||||||
### 查找偏移量
|
### 查找偏移量
|
||||||
|
@ -149,14 +149,14 @@ p.close()
|
||||||
|
|
||||||
## **任意写入**
|
## **任意写入**
|
||||||
|
|
||||||
格式化器 **`$<num>%n`** **在** **指定地址** 中写入 **已写入字节的数量**,该地址在栈中的 \<num> 参数中。如果攻击者可以使用 printf 写入任意数量的字符,他将能够使 **`$<num>%n`** 在任意地址写入任意数字。
|
格式化器 **`%<num>$n`** **在** \<num> 参数指定的地址 **写入** **已写入字节的数量**。如果攻击者可以使用 printf 写入任意数量的字符,他将能够使 **`%<num>$n`** 在任意地址写入任意数字。
|
||||||
|
|
||||||
幸运的是,要写入数字 9999,并不需要在输入中添加 9999 个 "A",为了做到这一点,可以使用格式化器 **`%.<num-write>%<num>$n`** 在 **`num` 位置指向的地址中写入数字 **`<num-write>`**。
|
幸运的是,要写入数字 9999,并不需要在输入中添加 9999 个 "A",为了做到这一点,可以使用格式化器 **`%.<num-write>%<num>$n`** 在 **`num` 位置指向的地址** 中写入数字 **`<num-write>`**。
|
||||||
```bash
|
```bash
|
||||||
AAAA%.6000d%4\$n —> Write 6004 in the address indicated by the 4º param
|
AAAA%.6000d%4\$n —> Write 6004 in the address indicated by the 4º param
|
||||||
AAAA.%500\$08x —> Param at offset 500
|
AAAA.%500\$08x —> Param at offset 500
|
||||||
```
|
```
|
||||||
然而,请注意,通常为了写入一个地址,例如 `0x08049724`(这是一个一次性写入的巨大数字),**使用的是 `$hn`** 而不是 `$n`。这允许**只写入 2 字节**。因此,这个操作需要进行两次,一次用于地址的高 2B,另一次用于低 2B。
|
然而,请注意,通常为了写入一个地址,例如 `0x08049724`(这是一个一次性写入的巨大数字),**使用的是 `$hn`** 而不是 `$n`。这允许**只写入 2 字节**。因此,这个操作需要进行两次,一次是针对地址的最高 2B,另一次是针对最低的。
|
||||||
|
|
||||||
因此,这个漏洞允许**在任何地址写入任何内容(任意写入)。**
|
因此,这个漏洞允许**在任何地址写入任何内容(任意写入)。**
|
||||||
|
|
||||||
|
@ -167,7 +167,7 @@ AAAA.%500\$08x —> Param at offset 500
|
||||||
{% endcontent-ref %}
|
{% endcontent-ref %}
|
||||||
|
|
||||||
我们将**覆盖**一个**函数**,该函数**接收**来自**用户**的**参数**并**指向****`system`** **函数**。\
|
我们将**覆盖**一个**函数**,该函数**接收**来自**用户**的**参数**并**指向****`system`** **函数**。\
|
||||||
如前所述,写入地址通常需要 2 个步骤:您**首先写入地址的 2 字节**,然后写入另外 2 字节。为此使用**`$hn`**。
|
如前所述,写入地址通常需要 2 个步骤:您**首先写入 2 字节**的地址,然后写入其他 2 字节。为此使用**`$hn`**。
|
||||||
|
|
||||||
* **HOB** 被调用为地址的 2 个高字节
|
* **HOB** 被调用为地址的 2 个高字节
|
||||||
* **LOB** 被调用为地址的 2 个低字节
|
* **LOB** 被调用为地址的 2 个低字节
|
||||||
|
@ -190,13 +190,13 @@ python -c 'print "\x26\x97\x04\x08"+"\x24\x97\x04\x08"+ "%.49143x" + "%4$hn" + "
|
||||||
|
|
||||||
### Pwntools 模板
|
### Pwntools 模板
|
||||||
|
|
||||||
您可以在以下位置找到用于准备此类漏洞的**模板**:
|
您可以在以下位置找到准备此类漏洞利用的**模板**:
|
||||||
|
|
||||||
{% content-ref url="format-strings-template.md" %}
|
{% content-ref url="format-strings-template.md" %}
|
||||||
[format-strings-template.md](format-strings-template.md)
|
[format-strings-template.md](format-strings-template.md)
|
||||||
{% endcontent-ref %}
|
{% endcontent-ref %}
|
||||||
|
|
||||||
或者可以从[**这里**](https://ir0nstone.gitbook.io/notes/types/stack/got-overwrite/exploiting-a-got-overwrite)找到这个基本示例:
|
或者这个基本示例来自[**这里**](https://ir0nstone.gitbook.io/notes/types/stack/got-overwrite/exploiting-a-got-overwrite):
|
||||||
```python
|
```python
|
||||||
from pwn import *
|
from pwn import *
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue