在CTF(Capture The Flag)竞赛中,堆溢出攻击是常见的一类挑战,其中Fastbin、Unsorted Bin和Largebin攻击是针对glibc(GNU C Library)堆管理器的特定漏洞利用技术。以下是关于这些技术的概述:
Fastbin Attack
Fastbins是glibc heap manager中用于存储小块(小于0x50字节)内存的一种特殊双链表结构。Fastbin攻击利用了fastbin的特性,即fastbin中的自由块不经过合并,而是直接被添加到对应的fastbin链表中。这种行为可以被恶意地操纵,导致在申请相同大小的内存块时,攻击者能够控制分配的内存位置,从而覆盖特定的指针或数据。
攻击步骤:
- 分配和释放:首先,分配一系列小块内存,然后释放它们,使它们落入同一个fastbin中。
- 重用漏洞:再次分配相同大小的内存时,由于fastbin的特性,分配的内存可能正好是之前释放的块。
- 数据注入:在释放和重新分配的过程中,攻击者可以通过精心构造的数据来覆盖某些指针或重要数据,从而实现对程序的控制。
Unsorted Bin Attack
Unsorted bin是glibc heap manager中用于存放大小超过一定阈值但又不足以放入largebin的块的链表。unsorted bin攻击通常发生在释放一个较大的内存块之后,如果攻击者能够控制这个块的前驱和后继指针,就有可能操纵堆结构,进而控制程序的执行流程。
攻击步骤:
- 分配大块内存:分配一块足够大的内存,使其进入unsorted bin。
- 释放和重用:释放这块内存,然后尝试通过某种方式重用这块内存,同时控制其前驱和后继指针指向的位置。
- 数据注入和控制:通过控制指针,攻击者可以指向任意内存位置,甚至指向程序的关键部分,如全局变量或函数指针。
Largebin Attack
Largebin用于管理大于128KB的内存块。大型块的管理较为复杂,因为它们不会被合并,且分配和释放时的检查更为严格。然而,通过精细的内存管理控制,攻击者仍然可以利用大型块的分配和释放过程中的缺陷。
攻击步骤:
- 分配和释放:与上述攻击类似,首先分配和释放大块内存。
- 利用缺陷:利用glibc堆管理器在处理大型块时的某些缺陷或不一致性,如double free漏洞。
- 控制堆:通过控制大型块的分配和释放顺序,攻击者可以影响堆的布局,最终达到控制程序的目的。