2024-06-16 09:01:21 +00:00
|
|
|
|
# 堆溢出
|
|
|
|
|
|
2024-07-18 17:33:27 +00:00
|
|
|
|
{% 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">\
|
|
|
|
|
学习并练习GCP黑客技术:<img src="/.gitbook/assets/grte.png" alt="" data-size="line">[**HackTricks培训GCP红队专家(GRTE)**<img src="/.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
|
2024-06-16 09:01:21 +00:00
|
|
|
|
|
2024-07-18 17:33:27 +00:00
|
|
|
|
<details>
|
2024-06-16 09:01:21 +00:00
|
|
|
|
|
2024-07-18 17:33:27 +00:00
|
|
|
|
<summary>支持HackTricks</summary>
|
2024-06-16 09:01:21 +00:00
|
|
|
|
|
2024-07-18 17:33:27 +00:00
|
|
|
|
* 查看[**订阅计划**](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来分享黑客技巧**。
|
2024-06-16 09:01:21 +00:00
|
|
|
|
|
|
|
|
|
</details>
|
2024-07-18 17:33:27 +00:00
|
|
|
|
{% endhint %}
|
2024-06-16 09:01:21 +00:00
|
|
|
|
|
|
|
|
|
## 基本信息
|
|
|
|
|
|
2024-07-18 17:33:27 +00:00
|
|
|
|
堆溢出类似于[**栈溢出**](../stack-overflow/),但发生在堆中。基本上意味着在堆中保留了一些空间来存储一些数据,**存储的数据大于保留的空间。**
|
2024-06-16 09:01:21 +00:00
|
|
|
|
|
2024-07-18 17:33:27 +00:00
|
|
|
|
在栈溢出中,我们知道一些寄存器,如指令指针或堆栈帧,将从堆栈中恢复,并且可能滥用这一点。在堆溢出的情况下,**堆块中默认没有存储任何敏感信息**,可以被溢出。但是,可能是敏感信息或指针,因此此漏洞的**严重性取决于**可以被覆盖的**数据以及攻击者如何滥用此漏洞**。
|
2024-06-16 09:01:21 +00:00
|
|
|
|
|
|
|
|
|
{% hint style="success" %}
|
|
|
|
|
为了找到溢出偏移量,您可以使用与[**栈溢出**](../stack-overflow/#finding-stack-overflows-offsets)相同的模式。
|
|
|
|
|
{% endhint %}
|
|
|
|
|
|
2024-07-18 17:33:27 +00:00
|
|
|
|
### 栈溢出与堆溢出
|
2024-06-16 09:01:21 +00:00
|
|
|
|
|
2024-07-18 17:33:27 +00:00
|
|
|
|
在栈溢出中,当漏洞触发时,堆栈中将出现的排列和数据相当可靠。这是因为堆栈是线性的,在冲突内存中始终增加,在程序运行的特定位置,堆栈内存通常存储类似类型的数据,并且具有一些特定结构,其中堆栈部分的末尾有一些指针。
|
2024-06-16 09:01:21 +00:00
|
|
|
|
|
2024-07-18 17:33:27 +00:00
|
|
|
|
然而,在堆溢出的情况下,使用的内存不是线性的,而是**分配的块通常位于内存的分离位置**(不是相邻的),因为**通过大小分隔分配的bin和zone**,以及**在分配新块之前使用先前释放的内存**。很难知道将与易受堆溢出的对象发生冲突的对象是什么。因此,当发现堆溢出时,需要找到一种**可靠的方法**,使期望的对象从易受溢出的对象的旁边进入内存。
|
2024-06-16 09:01:21 +00:00
|
|
|
|
|
2024-07-18 17:33:27 +00:00
|
|
|
|
用于此目的的技术之一是**堆整理**,例如在[**此文章**](https://azeria-labs.com/grooming-the-ios-kernel-heap/)中使用。文章中解释了在iOS内核中,当一个区域的内存用完以存储内存块时,它会通过内核页扩展,然后将该页分割为预期大小的块,这些块将按顺序使用(直到iOS版本9.2,然后这些块以随机方式使用,以增加这些攻击的利用难度)。
|
2024-06-16 09:01:21 +00:00
|
|
|
|
|
2024-07-18 17:33:27 +00:00
|
|
|
|
因此,在先前的文章中,发生堆溢出时,为了强制溢出的对象与受害者顺序发生冲突,通过几个线程强制执行几个**`kallocs`**,以确保所有空闲块都被填充,并创建一个新页面。
|
2024-06-16 09:01:21 +00:00
|
|
|
|
|
2024-07-18 17:33:27 +00:00
|
|
|
|
为了强制使用特定大小的对象填充此对象,与iOS mach端口相关联的**离线分配**是一个理想的选择。通过精心制作消息的大小,可以精确指定`kalloc`分配的大小,当相应的mach端口被销毁时,相应的分配将立即释放回`kfree`。
|
2024-06-16 09:01:21 +00:00
|
|
|
|
|
2024-07-18 17:33:27 +00:00
|
|
|
|
然后,可以**释放**其中一些占位符。**`kalloc.4096`**空闲列表以后进先出的顺序释放元素,这基本上意味着如果释放了一些占位符,并且尝试在分配易受溢出的对象时分配多个受害者对象,那么很可能该对象将被受害者对象跟随。
|
2024-06-16 09:01:21 +00:00
|
|
|
|
|
|
|
|
|
### 示例libc
|
|
|
|
|
|
|
|
|
|
在[**此页面**](https://guyinatuxedo.github.io/27-edit\_free\_chunk/heap\_consolidation\_explanation/index.html)中,可以找到一个基本的堆溢出仿真,展示了如何通过覆盖下一个块的使用中的前一个位和前一个大小的位置,可以**合并一个已使用的块**(使其认为未使用),然后再次分配它,从而能够覆盖正在不同指针中使用的数据。
|
|
|
|
|
|
2024-07-18 17:33:27 +00:00
|
|
|
|
另一个来自[**protostar heap 0**](https://guyinatuxedo.github.io/24-heap\_overflow/protostar\_heap0/index.html)的示例展示了一个CTF的非常基本的示例,其中可以滥用**堆溢出**来调用获得**标志的winner函数**。
|
2024-06-16 09:01:21 +00:00
|
|
|
|
|
|
|
|
|
在[**protostar heap 1**](https://guyinatuxedo.github.io/24-heap\_overflow/protostar\_heap1/index.html)示例中,可以看到如何通过滥用缓冲区溢出,可以**覆盖附近块中的地址**,其中**用户的任意数据**将被写入。
|
|
|
|
|
|
|
|
|
|
### 示例ARM64
|
|
|
|
|
|
2024-07-18 17:33:27 +00:00
|
|
|
|
在页面[https://8ksec.io/arm64-reversing-and-exploitation-part-1-arm-instruction-set-simple-heap-overflow/](https://8ksec.io/arm64-reversing-and-exploitation-part-1-arm-instruction-set-simple-heap-overflow/)中,您可以找到一个堆溢出示例,其中将要执行的命令存储在溢出块的下一个块中。因此,可以通过用易受攻击的方式覆盖它来修改要执行的命令,例如:
|
2024-06-16 09:01:21 +00:00
|
|
|
|
```bash
|
|
|
|
|
python3 -c 'print("/"*0x400+"/bin/ls\x00")' > hax.txt
|
|
|
|
|
```
|
2024-07-17 18:06:18 +00:00
|
|
|
|
### 其他示例
|
2024-06-16 09:01:21 +00:00
|
|
|
|
|
2024-07-17 18:06:18 +00:00
|
|
|
|
* [**Auth-or-out. Hack The Box**](https://7rocky.github.io/en/ctf/htb-challenges/pwn/auth-or-out/)
|
|
|
|
|
* 我们利用整数溢出漏洞来实现堆溢出。
|
|
|
|
|
* 我们损坏了溢出块中的`struct`内的函数指针,以设置诸如`system`之类的函数,并实现代码执行。
|
2024-07-18 17:33:27 +00:00
|
|
|
|
|
|
|
|
|
{% hint style="success" %}
|
|
|
|
|
学习并练习AWS Hacking:<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">\
|
|
|
|
|
学习并练习GCP Hacking: <img src="/.gitbook/assets/grte.png" alt="" data-size="line">[**HackTricks 培训 GCP 红队专家 (GRTE)**<img src="/.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
|
|
|
|
|
|
|
|
|
|
<details>
|
|
|
|
|
|
|
|
|
|
<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 来分享黑客技巧。
|
|
|
|
|
|
|
|
|
|
</details>
|
|
|
|
|
{% endhint %}
|