Double Free
Last updated
Last updated
学习与实践 AWS 黑客技术:HackTricks 培训 AWS 红队专家 (ARTE) 学习与实践 GCP 黑客技术:HackTricks 培训 GCP 红队专家 (GRTE)
如果你多次释放一块内存,它可能会破坏分配器的数据并打开攻击的门。事情是这样的:当你释放一块内存时,它会返回到一个空闲块的列表中(例如“快速 bin”)。如果你连续两次释放同一块内存,分配器会检测到这一点并抛出错误。但是如果你在两次释放之间释放了另一块内存,双重释放检查就会被绕过,导致数据损坏。
现在,当你请求新的内存(使用 malloc
)时,分配器可能会给你一个已经被释放两次的块。这可能导致两个不同的指针指向同一内存位置。如果攻击者控制了其中一个指针,他们可以更改该内存的内容,这可能导致安全问题,甚至允许他们执行代码。
示例:
在这个例子中,在用几个已释放的块(7)填充 tcache 后,代码 释放块 h
,然后释放块 i
,再释放 h
,导致双重释放(也称为 Fast Bin dup)。这打开了在重新分配时接收重叠内存地址的可能性,这意味着两个或多个指针可以指向同一内存位置。通过一个指针操纵数据可能会影响另一个,造成严重的安全风险和潜在的利用。
执行时,请注意 i1
和 i2
得到了相同的地址:
我们只能分配 Fast-Bin 大小的块,除了大小为 0x70
,这会阻止通常的 __malloc_hook
覆盖。
相反,我们使用以 0x56
开头的 PIE 地址作为 Fast Bin dup 的目标(1/2 概率)。
PIE 地址存储的一个地方是在 main_arena
中,它在 Glibc 内部,并靠近 __malloc_hook
。
我们针对 main_arena
的特定偏移量来分配一个块,并继续分配块,直到到达 __malloc_hook
以获得代码执行。
使用 Tcache bins 和一个空字节溢出,我们可以实现双重释放情况:
我们分配三个大小为 0x110
的块(A
,B
,C
)
我们释放 B
我们释放 A
并重新分配以使用空字节溢出
现在 B
的大小字段是 0x100
,而不是 0x111
,所以我们可以再次释放它
我们有一个大小为 0x110
的 Tcache-bin 和一个大小为 0x100
的 Tcache-bin,它们指向相同的地址。因此我们有一个双重释放。
我们利用双重释放使用 Tcache poisoning
学习和实践 AWS 黑客技术:HackTricks Training AWS Red Team Expert (ARTE) 学习和实践 GCP 黑客技术:HackTricks Training GCP Red Team Expert (GRTE)