1. Linux堆管理算法
Linux系统通过glibc程序库提供堆内存管理功 能,存在两种堆管理算法.
glibc2.2.4及以下版本是使用Doug Lea的实现方法 tcmalloc .
glibc2.2.5及以上版本采用了Wolfram Gloger的 ptmalloc/ptmalloc2代码。ptmalloc2代码是从 Doug Lea的代码移植过来的,增加了对多线程 的支持,并引进了fastbin机制.
2. unlink 攻击
时间有限,以后补上详细介绍。
主要参看下面两篇文章:
https://jaq.alibaba.com/community/art/show?articleid=360
http://staff.ustc.edu.cn/~sycheng/ssat/ch04a_Heap_Overflow.pdf
1 背景介绍
首先,存在漏洞的程序如下:
在代码[3]中存在一个堆溢出漏洞:如果用户输入的argv[1]的大小比first变量的666字节更大的话,那么输入的数据就有可能覆盖掉下一个chunk的chunk header——这可以导致任意代码执行。而攻击的核心思路就是利用glibc malloc的unlink机制。
上述程序的内存图如下所示:
2 unlink技术原理
2.1 基本知识介绍
unlink攻击技术就是利用”glibc malloc”的内存回收机制,将上图中的second chunk给unlink掉,并且,在unlink的过程中使用shellcode地址覆盖掉free函数(或其他函数也行)的GOT表项。这样当程序后续调用free函数的时候(如上面代码[5]),就转而执行我们的shellcode了。显然,核心就是理解glibc malloc的free机制。
在正常情况下,free的执行流程如下文所述:
PS: 鉴于篇幅,这里主要介绍非mmaped的chunks的回收机制,回想一下在哪些情况下使用mmap分配新的chunk,哪些情况下不用mmap?
一旦涉及到free内存,那么就意味着有新的chunk由allocated状态变成了free状态,此时glibc malloc就需要进行合并操作——向前以及