免费教程_免费网赚教程_破解版软件-寂涯网络学习基地

当前位置: 主页 > 系统综合 > 系统安全 > 再谈CVE-2011-0073 firefox漏洞

再谈CVE-2011-0073 firefox漏洞

时间:2012-02-08 19:37来源:未知 整理:寂涯网络 点击:

之前看雪论坛的cscoder兄弟已经写过一篇日志了,cscoder兄弟主要是通过调试分析漏洞触发原因,使用的是windbg来分析。 他提供的POC我始终不能触发异常,跟他联系得知此POC只能在java环境下才能过DEP/ ASLRo不得已只能自己从MSF上获取,才发现MSF已有不依赖java环境的稳定溢出POC。 笔者按照自己的思路详细描述自己对新poc的分析过程,思路感觉更加清晰。注重细节, 几乎精确到每个调试过程。特别是最后的rop构造,感觉在漏洞中是比较有特色的。
漏洞触发原因分析过程
10466592 FF76 10 push dword ptr [esi+10]
10466595 8B08 mov ecx, dword ptr [eax] //虚函数表基地址
10466597 FF76 0C push dword ptr [esi+C]
1046659A 50 push eax 
1046659B FF51 70 call dword Dtr Tecx+70l
常弹出计算器。打开JS文件,破环shellcode,

很明显,这是一个覆盖虚表指针,然后由于虚表函数被调用,导致了 shellcode被执行。 又是一个use after free的经典例子。
再上溯栈中函数返回值,发现调用:我们暂定call 1046657e调用的函数为BugTrigger。
104A9473 8B4424 04 mov eax, dword ptr [esp+4]
104A9477 8B40 lC mov eax, dword ptr [eax+lC]
104A947A 85C0 test eax, eax 
104A947C 74 06 je short 104A9484 
104A947E 50 push eax  
104A947F E8 FAD0FBFF call 1046657E ; BugTrigger
104A9484 33C0  xor eax, eax 

恢复js中的shellcode,重新用调试器加载。在bugtrigger函数的入口处设置断点,调试器断下来。此时通过栈回溯我们会发现:JS中的代码在汇编中体现了出来。首先创建了一个对象,然后进入了我们的BugTrigger 函数。为了方便以后的分析,我们在call operator new处加入一个软件断点。在进入 8#1^^886『之前,我们查看6&工、也就是新创建对象指针对应的堆

图1

JS中的代码在汇编中体现了出来。首先创建了一个对象,然后进入了我们的BugTrigger 函数。为了方便以后的分析,我们在call operator new处加入一个软件断点。在进入 8#1^^886『之前,我们查看6&工、也就是新创建对象指针对应的堆内容:

图2

由于每次运行创建对象返回的指针不同,出于便于描述考虑,我们把eax这个对象指针命名为objpointer。
在bugtrigger函数开始处,有个执行流程的跳转判断:
我们断点处可以看出,此时eax=[objpoiter]+8.也就是说,此时会对[objpointer]+8处的dword判断是否为0.
[[0bjPointer]+8]FS0,虚表函数得到调用call dword ptr [ecx+70]时, 我们在8叫1^^886『函数的入口处设置断点。程序在此处断下。也就是说,8叫1^^886『函数 在调用虚函数时,又嵌套调用它自己。
这里我们发现一个小情况:再次查看比较判断处6狀地址的内存情况,惊奇的会发现, [[0bjPointer]+8]已经被修改为 0 了。
前面已经说明,[[0bjPointer]+8]S 0会导致虚函数得不到调用,因此我们在
[[0bjPointer]+8]地址处设置内存写入断点。查看[[0bjPointer]+8]何时被修改为0的。
重新运行poc调试,调试器在内存写入eax地址时断下。
在程序执行时果然这个值被修改。这个时候我们查看内存中是否已经有喷设值,发现堆喷射没有进行。另外溢出调用bugtrigger的函数开始处设置断点,调试器断在下图所示:这时我们要注意:断点这个执行实在第一次调用bugtrigger函数时call虚函数时断下来的。)

图3

程序又一次调用call BugTrigger,在进入函数内部时压入的参数和之前的eax是一样 的。由于之前判断处[[01^下01於61]+8]值已经被修改为0 了,程序跳过了 call [ecx+0x70] 0
esi, duord ptr [esi+8]、 esi, esi
short 10466583 Bsi
此处判断决定能否再次调用虚函数
执行完8呢1^188虹之后,程序对对象指针进行了删除,并清零(见图7)。其实就是邛 中ZLUurXitDV. c 1 earSe 1 ection();函数的汇编实现过程。
在创建完这个对象并对此对象进行删除后,开始了堆喷射。其实就是为了覆盖刚刚删除 了的04_?01於虹对象的内容,以便有可能覆盖虚表指针。进而在此对象的虚函数再次调用
时控制EIPo

本页地址 http://www.jybase.net/xitonganquan/20120208766.html

百度搜索更多

谷歌搜索更多

顶一下
(0)
0%
踩一下
(0)
0%
------分隔线----------------------------

评价:
昵称: 验证码:点击我更换图片
推荐内容
赞助商
赞助商


关于本站免责声明视频更新google百度地图视频地图RRS订阅

如有什么问题请在本站留言,或发邮件到 hxt167#foxmail.com