UAF(释放后使用)漏洞是一种运行内存损坏漏洞,普遍存在于计算机浏览器中。最近,最新版本的电脑浏览器增加了一系列控件,这也使得利用该漏洞的难度越来越大。即便如此,它们似乎仍然存在。
本文的重点是简要而详细地介绍这一漏洞,并展示一些与其利用相关的基本信息。也没有写如何绕过新的内存保护(我还没想出来),但是我会研究这个特殊问题的根源。
我选择MS14-035(https://technet.microsoft.com/library/security/MS14-035)作为例子。我选择这个漏洞有几个原因。首先,ExploitDB(https://www.Exploit-DB.com/exploits/33860/)中有一个非常好的POC,会在IE8到10中宣告崩溃。其次,在exploitDB中,我找不到针对此漏洞的现有可行的利用方式。
尽管exploitDB上的利用率很低,但我还是尽力找到了一些与这个问题相关的博客。你可以试试其中一个:
https://translate.google.com.au/translate?HL=en&;sl=pl&u=https://malware.prevenity.com/2016/02/cwiczenie-przykad-wykorzystania-bedu.html&;prev=搜索
https://www.NCCgroup.trust/globalassets/our-research/uk/whitepapers/2015/12/CVE-2014-0282pdf/
https://www.cybersphinx.com/exploining-CVE-2014-0282-ms-035-cinput-use-after-free-vulnerability/
在你阅读这篇文章的同时,我也强烈推荐以下文章供你参考:
https://www.blackhat.com/presentations/BH-Europe-07/sotiROV/whitepaper/BH-eu-07-sotiROV-WP.pdf
https://www.corelan.be/index.PHP/2013/02/19/deps-precise-heap-spray-on-Firefox-and-ie10/
https://www.corelan.be/index.PHP/2011/12/31/exploit-写作-教程-part-11-堆喷-去神秘化/
https://www.fuzzysecurity.com/tutorials/expDev/11.html
https://expdev-kiuhnm.rhcloud.com/2015/05/11/contents/
现在,我们来讨论一下POC(https://www.exploit-db.com/exploits/33860/)。请看看内容,并尽可能多地了解它。大家都做了调整,想弄清楚每个部分的效果,还有哪些东西和我们在程序调试中看到的有什么关系。我觉得这个时候发布这种内容更有意义。
我的自然环境是Windows7SP132位系统和IE8.0.7601.17514。这是安装新的Windows7SP132位系统时默认设置的IE8版本号。其他必须使用的手机软件有windbg和gflags,可以在https://developer.Microsoft.com/en-us/windows/hardware/windows-driver-kit免费下载。
如果已经设置了上述自然环境,请在InternetExplorer中打开POC,并在整个过程中添加windbg。很有可能你要设置windbg的标记路径,你可以在https://msdn.Microsoft.com/en-us/library/windows/desktop/ee416588(v=vs.85).aspx找到需要的信息内容,设置好标记路径后,在电脑浏览器中点击允许屏蔽内容。你可以看到windbg已经崩溃了,它看起来是这样的:
图1:1中的POC:windbg崩溃。
看这个崩溃,你会发现eip偏向于失败的运行内存。现在你要搞清楚eip值从何而来。。
借助kb指令查询启用堆栈后的指令,在CFormElement::DoReset函数执行过程中发生崩溃。这为大家的难题研究提供了一个非常好的起点,但是你仍然需要大量的资料。
下一步是在gflags上启动customer模式的局部变量跟踪和页面堆,然后再次运行POC。Gflags是一个非常有用的辅助故障检测的特殊工具。你可以在这里阅读文章中关于它的所有信息:https://msdn.Microsoft.com/en-us/library/windows/hardware/ff549609(v=vs.85)。aspx。以下指令可能会打开页堆和客户端模式局部变量跟踪:
Gflags.exe/I·iexplore.exe·乌斯帕(你可以根据/p/enable打开所有正常的页面堆)。
在打开客户模式的页面堆和局部变量跟踪之后,所有人都将再次运行POC,并得到以下windbg输出:
图2:打开页面堆和客户模式局部变量跟踪后的POC崩溃。
堆将做几件事来确定运行内存是否损坏。它将使用f0f0f0f0F0来确定释放的堆分配。例如,每当进程释放堆分配时,页面堆标识符将驱动该分配被F0F0F0F0所覆盖。在充分考虑了这一点之后,每个人都得到第一个信号,这是一个UAF问题。在调用dwordptr[eax1CCh]时,大家发现程序流崩溃了。这个过程试图启用一个函数,这个函数的详细地址应该存储在[eax0x1cc]中,但是不知道现在eax中存储的值是0xf0f0f0,这个值来自刚刚释放的堆内存。
为了更好的证实这一点,我们首先要搞清楚eax的当前值是从哪里来的。。为了更好地确保这一点,我们应该研究图1所示的CFormElement::DoReset函数。
下图是windbg指令ufmshtml!CFormElement::DoReset的部分输出。我没办法,只能提取一部分,因为它的产量更长,而现在,大家真正感兴趣的只有这一小块:
图3:mshtml!CFormElement::DoReset函数汇编代码的一部分
突出显示的代码是程序流崩溃的地方。根据你之前对图2中崩溃的分析,你很可能认出这部分的最后一行。现在可以看到,eax的值来自命令moveax,dwordptr[esi]。是典型的虚拟类比调用函数,我们来看看虚拟类比函数是如何工作的。
虚涵数是一种友函数,可以改,写成派生式。C语言编译器为每个类建立虚函数表后,C就可以完成了。虚函数表本质上是函数的索引值表,每个索引值都倾向于不同的虚函数表。当目标建立后,第一个成员函数成为虚拟表中的另一个这样的索引值,称为VPTR。当一个虚函数被使能时,整个进程将运行VPTR,虚函数将被使能并有一个适度的偏移量。
图4显示了虚函数是如何工作的。
图4:有总流程的虚拟调用函数的数据图表。
在图3中突出显示的代码中,程序流程使用命令moveax,dwordptr[esi]将位于esi中的VPTR复制到eax存储器中。现在eax包含了虚函数表的详细地址。然后,calldwordptr[eax1CCh]命令将尝试启用偏移量为0x1cc的虚拟相似性。
为了更好的在esi中找到与发布目标相关的大量信息,我们可以应用windbg!堆指令打开客户端模式的局部变量跟踪。该指令的输出内容如图5所示:
图5:当它倒塌时!堆p-aesi指令的输出。
图5显示了堆分配的局部变量足迹,包括esi中的内存地址。我们首先可以看到的是目标的大小是0x60——这一点非常重要。除此之外,我们可以看到mshtml在局部变量跟踪中是启用的!Textarea::`标量删除破坏者'函数。这再次表明目标已经被释放,因为这是析构函数的激活。还可以知道这是来自CFormElement类的CTextArea目标。很明显,这实际上是一个UAF漏洞,一个虚拟调用函数导致了崩溃。
嗯,到目前为止,大家都花了很多时间在程序调试上。每个人都得到了结果:这是一个UAF漏洞。当程序进程试图从已释放的CTextArea目标中启用虚函数时,它将崩溃。下面的POC开场文档可能值得一看,看看我们是如何得到这种编码方法的。
图6:导致崩溃的POC
看一看图6,并记住您之前所做的,以便我们可以得到一些结果。我们可以在windbg中检测到这个结果。
首先,创建一个名为“testfm”的表。该报告由四部分组成,其中两部分是文本区域。从你之前的调整,我们可以知道释放的目标是CTextArea目标。
下一个有趣的部分是脚本logo中转换函数的声明。这个数字将清除报告的内容并释放CTextArea目标。
最后,在脚本制作logo的底部,我们可以看到“testfm”中的“child2”元素已经被勾选。随后,可以通过应用onpropertychange的恶性事件特性来设置和实现变换函数。从这个表的上面调用函数reset。
在表上启用Reset时,实际上启用了CFormElement::DoReset函数。这个数字是基于每个部分连续,属性被重置。当系统循环到“child2”原语时,转换功能将被启用,表格内容将被删除,表单元素目标将被释放。下一次循环系统到达释放的“child3”元素时,该进程将在调用该函数时崩溃。
为了更好地利用它,我们必须建立一个伪堆目标,它将占用运行内存中释放的区域。此外,这个假目标还必须有一个假VPTR和一个假虚拟类比表。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)