
漏洞的可利用性高度依赖于glibc的版本,而下面的解释是基于Ubuntu18.04和glibc2.27的,后者支持tcache。
首先,我们要确定这个溢出漏洞所能控制的内容:
-
在der_get_oid()中分配的易受攻击的缓冲区的大小和内容是可控的。顺便说一下,当当前请求完成后,该缓冲区将被释放。
-
decode_MechTypeList()中有一个while循环,用于重复执行der_get_oid()函数,并且循环次数也是可控的。
有了这两点,我们就可以轻松地操纵堆了。为了准备堆,我们可以耗尽任意大小的tcache bins,并在请求完成后重新对其进行填充。同时,重新填充的分块(chunk)在内存中可以是连续的。这使得内存布局相当有利于通过缓冲区溢出发动攻击。
实现任意写原语
在这个阶段,通过滥用tcache空闲列表可轻松实现任意写原语。
触发一个4字节的溢出来扩展下一个空闲的chunk大小。
在下一个请求中,在受损的chunk中分配内存空间。当请求结束时,它将被移动到新的tcache bin中。
用新的大小再次分配受损的chunk。这时,受损的chunk将与下一个空闲的chunk发生重叠,然后,用一个任意的值覆盖其freelist。
从“中毒的”tcache freelist上分配内存空间。它将返回一个任意地址。
泄漏内存地址
默认情况下,会为BIND启用所有Linux缓解措施。因此,我们首先要搞定ASLR,这意味着我们需要找到一种从内存中泄漏地址的方法。一个可能实现内存泄漏的机会,是利用code_NegTokenArg()函数。该函数用于将响应消息编码到一个缓冲区中,并
(编辑:桂林站长网)
【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!
|