windows10的cfg,windows10cf兼容性最佳设置

【windows10的cfg,windows10cf兼容性最佳设置】

windows10的cfg,windows10cf兼容性最佳设置

文章插图
翻译:myswsun
预估稿费:170RMB
投稿方式:发送邮件至linwei#360.cn , 或登陆网页版在线投稿
0x00 前言
本文是2016年7月一些研究的结果 , 但是直到现在才能发布 。在6月 , Theori发布了一篇博文关于IE的漏洞MS16-063 , 他们写的利用是针对Windows7上IE 11版本 , 并且他们认为因为Windows 10 的CFG机制无法在Windows 10利用 。本文描述了我如何在Windows 10利用 , 并绕过CFG , 事实我还发现了另一种方法 , 会在将来发布 。
0x01 理解CFG
控制流保护(CFG)是微软在Windows 8.1 update 3和Windows 10中实现的缓解措施 , 用来保护汇编级别的非直接调用 。趋势已经公布了Windows 10上面关于CFG的很好的分析文章 。已经有集中公布的绕过CFG的方法 , 但是这些方法主要的目标是CFG实现算法 , 但是我想从这个功能的弱点入手 。因为Theori在他们博文中写的Windows 7上面的利用因为CFG的存在无法有效工作 , 让我们看下为什么并试图绕过它 。
来自Theori的利用代码在Windows 10的IE中直接覆盖了虚函数表 。因此问题是我们如何利用任意读写来绕过CFG 。根据趋势的研究 , CFG被函数LdrValidateUserCallTarget调用来验证一个函数的调用是否用了非直接调用:
windows10的cfg,windows10cf兼容性最佳设置

文章插图
加载到EDX中的指针是验证位图的基本指针 , 在这种情况下是:
windows10的cfg,windows10cf兼容性最佳设置

文章插图
然后 , 被验证的函数将其地址加载到ECX中 , 如果kernel32!VirtualProtectStub作为示例 , 则在这种情况下的地址是:
windows10的cfg,windows10cf兼容性最佳设置

文章插图
然后地址右移8位 , 用于装入保存该地址有效位的DWORD值 , 在这种情况下:
windows10的cfg,windows10cf兼容性最佳设置

文章插图
然后函数地址右移3位 , 并执行位测试 , 这本质上对位移地址进行模数0x20操作 , 然后是验证位图的DWORD中检查的位 , 因此在这种情况下:
windows10的cfg,windows10cf兼容性最佳设置

文章插图
因此相关位在偏移0x14处:
windows10的cfg,windows10cf兼容性最佳设置

文章插图
这意味着它是可靠的 。因此VirtualProtect的调用地址是可靠的 , 然而这没有真的解决问题 , 它的参数也必须由攻击者提供 。正常情况应该是用ROP链 , 但是任何不是从函数开始的字节都是无效的 。因此解决方案是找到一个函数在被调用的地方的参数是可以控制的 , 并且函数的功能可以给攻击者利用 。这需要在利用中非常仔细 。
0x02 在Windows 10中利用
在Theori提供的利用 , 代码是通过stack pivot小配件覆盖TypedArray的虚函数表 , 因此这个没有其他可能了 , 研究TypedArray提供的函数是值得的 , 发现下面两个函数比较有用:
windows10的cfg,windows10cf兼容性最佳设置

文章插图

windows10的cfg,windows10cf兼容性最佳设置

文章插图
他们的偏移是0x7c和0x188 , 他们能从Javascript代码中直接调用 , 并且HasItem有个可以控制的参数 , 同时Subarray有两个用户可控制的参数 。然而问题是它们都不返回除布尔值之外的任何数据 。此外 , 所选择的函数必须采用相同数量的参数 , 否则堆栈不平衡将会引发异常 。我搜索的API应该暴露一个指针能用来覆盖返回地址 , 以便可以绕过CFG 。

推荐阅读