0%

堆相关漏洞利用原理

1. Fastbin attack

fastbin是单链表结构。

double free + fastbin: 两次释放同一个fast chunk,在fastbin中形成一个环,glibc为了效率不会检查链表中的每个结点,然后申请同样大小的chunk,会得到一个影子chunk,这个时候修改这个chunk的FD字段,再申请一个同样大小的chunk,这个时候fastbin的链表头指向FD的地址处,形成任意地址写,前提是这个地址处的size字段处要有合适的数据,可写的内容是偏移一段后的位置。

glibc通过unsortedbin来管理长度比fastbin大的堆块,双链表结构。

攻击前提:可以篡改一个unsortedbin的fd和bk。

双链表结构摘除一个元素的时候,需要unlink。

3. House of Force

申请堆块时没有bin对应的大小,会从topchunk中切一块大小。

攻击前提:可以篡改topchunk的size字段。

如果topchunk.size过大,会触发mmap分配新的内存。

如果得到了一个很大的堆块,topchunk可能会落在libc的数据段,再次申请,就可以那道一块在libc所在的内存,从而实现任意改写libc内容的能力。

4. Tcache poisoning

类似于fastbin的分配机制,优先级更高,单链表、LIFO,申请堆块时不检查size。

攻击前提:可以篡改chunk的fd字段,比如存在一个UAF漏洞或Double Free漏洞。

5. Heap Fengshui

利用堆管理机制的确定性,构造一系列的堆申请、释放序列来控制堆内存布局,使得溢出的部分刚好落在想要的位置。(过于玄学!!)

堆风水的构造需要两个方面的知识:

  • 操作系统的堆管理机制与一些复杂应用软件自己的内存管理机制
  • 软件中对内存进行申请释放的操作,及其关联影响。

操作系统的堆管理机制可能会有内存碎片整理机制,打乱你预期的风水布局。

6. UAF漏洞

最常见、大型软件中利用复杂度高,但危害也是最大的。

利用思路:

  • 一块内存被释放,攻击者获得该内存的控制权,在再次使用前的时间窗口内攻击者可以对这块内存进行写操作。
  • 多半是类对象