游戏之家,中国专业手机游戏门户!
L当前位置:首页 > 系统资讯 > WIN7资讯

绕过Windows10的CFG机制www.diyixitong.com

作者:第一系统网2017-03-28 17:05:16来源:第一系统网

绕过Win10的CFG机制www.diyixitong.com

0x00 前言

本文是2016年7月一些研究的功效,第一系统:www.diyixitong.com,但是直到此刻才气宣布。在6月,Theori宣布了一篇博文关于IE的缝隙MS16-063,他们写的操作是针对Windows 7上IE 11版本,而且他们认为因为Windows10 的CFG机制无法在Windows10操作。本文描绘了我如安在Win 10操作,并绕过CFG,事实我还觉察 了另一种要领,会在将来宣布。

0x01 理解CFG

控制流掩护(CFG)是微软在Windows8.1 update 3和Win 10中实现的缓解法子,用来掩护汇编级此外非直接调用。趋势已经公布了Win 10上面关于CFG的很好的阐明文章。已经有集中公布的绕过CFG的要领,但是这些要领主要的方针是CFG实现算法,但是我想从这个成果的弱点入手。因为Theori在他们博文中写的Win 7上面的操作因为CFG的存在无法有效事情,让我们看下为什么并试图绕过它。

来自Theori的操作代码在Win 10的IE中直接笼罩了虚函数表。因此问题是我们如何操作任意读写来绕过CFG。按照趋势的研究,CFG被函数LdrValidateUserCallTarget调用来验证一个函数的调用是否用了非直接调用:

绕过Win10的CFG机制www.diyixitong.com

加载到EDX中的指针是验证位图的根基指针,在这种环境下是:

然后,被验证的函数将其地点加载到ECX中,假如kernel32!VirtualProtectStub作为示例,则在这种环境下的地点是:

然后地点右移8位,用于装入生存该地点有效位的DWORD值,在这种环境下:

然后函数地点右移3位,并执行位测试,这本质上对位移地点进行模数0x20操纵,然后是验证位图的DWORD中检查的位,因此在这种环境下:

因此相关位在偏移0x14处:

这意味着它是可靠的。因此VirtualProtect的调用地点是可靠的,然而这没有真的解决问题,它的参数也必需由打击者提供。正常环境应该是用ROP链,但是任何不是从函数开始的字节都是无效的。因此解决方案是找到一个函数在被调用的处所的参数是可以控制的,而且函数的成果可以给打击者操作。这需要在操作中很是仔细。

0x02 在Windows10中操作

在Theori提供的操作,代码是通过stack pivot小配件笼罩TypedArray的虚函数表,因此这个没有其他可能了,研究TypedArray提供的函数是值得的,觉察 下面两个函数比力实用:

他们的偏移是0x7c和0x188,他们能从javascript代码中直接调用,而且HasItem有个可以控制的参数,同时Subarray有两个用户可控制的参数。然而问题是它们都不返回除布尔值之外的任何数据。别的,所选择的函数必需接纳一样数量的参数,不然仓库不服衡将会引发异常。我搜索的API应该袒露一个指针能用来笼罩返回地点,以便可以绕过CFG。

我定位的可用的API是RtlCaptureContext,由kernel32.dll、kernelbase.dll和ntdll.dll导出,这个API有一个指向CONTEXT布局的参数:

绕过Win10的CFG机制www.diyixitong.com

CONTEXT布局储存了转储的所有的寄存器(包罗ESP),并且输入值仅仅是一个缓冲区的指针。看一下TypedArray工具的内存构造:

第一个DWORD值是虚函数表指针,能够被笼罩创建一个假的虚函数表,在偏移0x7c处存储API RtlCaptureContext的地点,同时偏移0x20是TypedArray指向的真实数据的指针:

因为泄漏这个缓冲区的地点也是可能的,它能提供RtlCaptureContext的参数。为了完成夹的虚函数表,不得不创建一个指针指向偏移0x7c处的ntdll!RtlCaptureContext,这意味着泄露了RtlCaptureContext的地点,继而意味这泄露了ntdll.dll的地点。执行此操纵的默认路径是使用vtable的地点,它是一个指向jscript9.dll的指针:

从这个指针往回0x1000个字节,搜索MZ头,继而查找到指向kernelbase.dll的导入表。做同样的操纵能偶获得kernelbase.dll的基址,然后再获得ntdll.dll的导入表指针并再次获得其基址,然后从导出函数中找到RtlCaptureContext。尽管这个要领是可靠的但是有个缺陷,假如在系统中装了EMET,将触发来自jscript9.dll的代码的瓦解,因为从PE头或导出表读取数据不被答允,为了绕过EMET我使用了一个差异的技术。记住每一个非直接调用都被CFG掩护,因为jscript9.dll的函数被CFG掩护了,所以不能调用直接指向ntdll的函数。一个在虚表中偏移0x10的函数如下:

绕过Win10的CFG机制www.diyixitong.com

用原始读操纵,指向ntdll.dll的指针能通过以下函数找到:

绕过Win10的CFG机制www.diyixitong.com

通过ntdll.dll的指针得到RtlCaptureContext的地点,不通过读取导出表而是使用搜索特征和哈希找到并读取。RtlCaptureContext看起来如下:

绕过Win10的CFG机制www.diyixitong.com

前0x30字节总是一样的而且很不凡,因此可以用哈希碰撞找到函数地点:

绕过Win10的CFG机制www.diyixitong.com

函数可以使用指向ntdll.dll的指针作为参数。

把上面的都整合到一起:

http://p5.qhimg.com/t01d83f536ac388ffb2.png


从这偏移0x200包括了RtlCaptureContext的功效,看起来如下:

http://p2.qhimg.com/t01ca503bfb149b03da.png


从上面可以清楚地看出仓库指针已经泄漏,此刻找到一个能控制执行的地点是个问题。看下栈顶显示:

大家都在玩
大家都在玩
排行榜
1 少年刀剑笑下载
少年刀剑笑

角色扮演网游_2018角色扮演大型网游_好玩的角色扮演手游大全

2 莽荒纪HD下载
莽荒纪HD

角色扮演网游_2018角色扮演大型网游_好玩的角色扮演手游大全

3 神话永恒下载
神话永恒

角色扮演网游_2018角色扮演大型网游_好玩的角色扮演手游大全

4 剑侠奇谭下载
剑侠奇谭

角色扮演网游_2018角色扮演大型网游_好玩的角色扮演手游大全

5 阴阳师手游下载
阴阳师手游

角色扮演网游_2018角色扮演大型网游_好玩的角色扮演手游大全

6 屠龙霸业下载
屠龙霸业

角色扮演网游_2018角色扮演大型网游_好玩的角色扮演手游大全

7 诛仙手游下载
诛仙手游

角色扮演网游_2018角色扮演大型网游_好玩的角色扮演手游大全

8 道场花园下载
道场花园

角色扮演网游_2018角色扮演大型网游_好玩的角色扮演手游大全

9 生化感染下载
生化感染

角色扮演网游_2018角色扮演大型网游_好玩的角色扮演手游大全

10 御龙战国下载
御龙战国

角色扮演网游_2018角色扮演大型网游_好玩的角色扮演手游大全