-
-
[翻译]堆溢出技术:Malloc Maleficarum之The House of Force
-
发表于: 2017-3-7 20:34 4041
-
我第一次是在2004年的“Exploiting the Wilderness”中写了关于glibc malloc的利用的。由于在那个文章中的技术是最早变得过时的,并且Malloc Maleficarum是以延续和进步的精神而撰写的,我觉得不得不再次尝试利用wilderness,这就是House of Force 的目的。“Exploit the Wilderness”中:
Wilderness是分配的内存中最高处的chunk。它和任何一块其他的申请的chunk类似,拥有一个头部以及可变长度的数据段。最重要的区别是wilderness,也被称为最高处的chunk,作为可用内存的分界线,是唯一个可以扩展或者缩小的块。这就意味着它必须被确保总是存在的,并且它必须被保存。
因此,glibc malloc中在调用malloc的时候对于wilderness会进行特殊处理。而且,最高处的chunk实际上永远也不会被free函数调用,而且永远不会包含应用的数据。这就意味着如果我们只能触发一个让最高处的chunk溢出的条件的话,the House of Force 在Malloc Maleficarum就是唯一的选择了。
House of Force 通过欺骗顶层代码将wilderness指针设置到任意值,这可能导致任意数据块被返回到请求的应用程序。这个技术需要调用两次malloc。该技术最主要的缺点是,第一调用的时候,我们必须能够完全控制所要申请的内存大小。第二次调用只需要足够大,能够触发wilderness的相关代码即可,当然返回的chunk在某种程度上是由我们控制的。
下面是wilderness的代码以及一些上下文环境:
该技术的首要目标是覆盖wilderness指针,av->top,为一个任意的值。为了可以做到这一点,我们必须可以控制剩余的chunk。假设堆最高处的chunk已经由于一个最大的chunk(或许0xffffffff)被溢出了。这样做是为了确保即使是较大的传递给malloc参数的值也只会触发wilderness代码而不是尝试去扩展堆。
Checked_request2size() 宏确保请求的值小于-2*MINSIZE(默认-32),同时为size和prev_size区域添加足够的空间,将final的值存储到nb里。对于这一技术的目的,checked_request2size()宏相对来说没有那么重要。
我们之前提到过,在这个技术中,我们对于malloc的调用必须拥有一个设计者可以控制的参数。可以看出,remainder的值可以通过将请求的值添加到已经存在的最高的chunk得到。由于顶部块尚未处于我们的控制之下,因此,我们申请的大小必须将reminder的位置定位在GOT项目或者.dtors入口前8个字节,或者任何其它之后的可以被我们用来规避执行的内存。
一旦wilderness 指针被指向了任意剩余的chunk,任何请求足够大的触发top chunk的malloc将会由我们的wilderness服务。因此,对于新的wilderness的唯一限制就是大小必须比触发顶部代码的请求的大小大。 将wilderness 设置为一个溢出的GOT表根本不是问题。然后只需要找到一个特定的场景,其中对malloc()的调用是我们所控制的缓冲区。
[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!