hacktricks/reversing-and-exploiting/linux-exploiting-basic-esp/stack-overflow/README.md

98 lines
5.6 KiB
Markdown
Raw Normal View History

# 栈溢出
<details>
<summary><strong>从零开始学习AWS黑客技术成为专家</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTEHackTricks AWS Red Team Expert</strong></a><strong></strong></summary>
支持HackTricks的其他方式
- 如果您想看到您的**公司在HackTricks中做广告**或**下载PDF格式的HackTricks**,请查看[**订阅计划**](https://github.com/sponsors/carlospolop)!
- 获取[**官方PEASS & HackTricks周边产品**](https://peass.creator-spring.com)
- 探索[**PEASS家族**](https://opensea.io/collection/the-peass-family),我们的独家[**NFTs**](https://opensea.io/collection/the-peass-family)
- **加入** 💬 [**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>
## 什么是栈溢出
**栈溢出**是一种漏洞,当程序向栈写入的数据超过其分配的空间时发生。这些多余的数据将**覆盖相邻的内存空间**,导致有效数据的损坏,控制流的中断,以及潜在地执行恶意代码。这个问题通常是由于使用不执行输入边界检查的不安全函数而引起的。
这种覆盖的主要问题在于**EIP**和**EBP**指针用于返回到前一个函数的位置是**存储在栈中**的。因此,攻击者可以覆盖这些指针并**控制程序的执行流**。
这种漏洞通常是因为一个函数**在栈内复制的字节数超过了为其分配的数量**,因此能够覆盖栈的其他部分。\
一些常见的易受攻击的函数包括:`strcpy`、`strcat`、`sprintf`、`gets`、`fgets`...
例如,以下函数可能存在漏洞:
```c
void vulnerable() {
char buffer[128];
printf("Enter some text: ");
gets(buffer); // This is where the vulnerability lies
printf("You entered: %s\n", buffer);
}
```
### 寻找栈溢出
发现栈溢出最常见的方法是提供一个非常大的`A`输入(例如`python3 -c 'print("A"*1000)'`),并期望出现`Segmentation Fault`,表明尝试访问地址`0x41414141`。
此外,一旦发现存在栈溢出漏洞,就需要找到偏移量,直到可以覆盖**EIP指针**,为此通常使用**De Bruijn序列**。对于大小为_k_的字母表和长度为_n_的子序列De Bruijn序列是一个循环序列其中长度为_n_的每个可能子序列恰好出现一次作为一个连续的子序列。
这样不需要手动找出哪个偏移量正在覆盖EIP可以使用这些序列之一作为填充然后找到最终覆盖它的字节的偏移量。
可以使用**pwntools**来实现:
```python
from pwn import *
# Generate a De Bruijn sequence of length 1000 with an alphabet size of 256 (byte values)
pattern = cyclic(1000)
# This is an example value that you'd have found in the EIP/IP register upon crash
eip_value = p32(0x6161616c)
offset = cyclic_find(eip_value) # Finds the offset of the sequence in the De Bruijn pattern
print(f"The offset is: {offset}")
```
或者 **GEF**
```bash
#Patterns
pattern create 200 #Generate length 200 pattern
pattern search "avaaawaa" #Search for the offset of that substring
pattern search $rsp #Search the offset given the content of $rsp
```
## 利用堆栈溢出
在溢出时(假设溢出大小足够大),您将能够覆盖堆栈内其他变量的值,直到达到 EBP 和 EIP甚至更多。\
滥用这种类型漏洞最常见的方式是通过**修改 EIP 指针**,这样当函数结束时,**控制流将被重定向到用户在此指针中指定的位置**。
然而,在其他情况下,也许只是**覆盖堆栈中一些变量的值**就足以进行利用(就像在简单的 CTF 挑战中一样)。
### Ret2win
在这种类型的 CTF 挑战中,二进制文件中有一个**函数****从未被调用****您需要调用它才能获胜**。对于这些挑战,您只需要找到**覆盖 EIP 的偏移量**,并找到要调用的函数的地址(通常会禁用 [**ASLR**](../common-binary-protections/aslr.md)),这样当有漏洞的函数返回时,隐藏函数将被调用:
{% content-ref url="ret2win.md" %}
[ret2win.md](ret2win.md)
{% endcontent-ref %}
### Ret2Shellcode
## 保护类型
{% content-ref url="../common-binary-protections/" %}
[common-binary-protections](../common-binary-protections/)
{% endcontent-ref %}
<details>
<summary><strong>从零开始学习 AWS 黑客技术,成为专家</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTEHackTricks AWS 红队专家)</strong></a><strong></strong></summary>
支持 HackTricks 的其他方式:
* 如果您想在 HackTricks 中看到您的**公司广告**或**下载 PDF 版本的 HackTricks**,请查看[**订阅计划**](https://github.com/sponsors/carlospolop)!
* 获取[**官方 PEASS & HackTricks 商品**](https://peass.creator-spring.com)
* 探索[**PEASS 家族**](https://opensea.io/collection/the-peass-family),我们的独家[**NFT**](https://opensea.io/collection/the-peass-family)收藏品
* **加入** 💬 [**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>