[漏洞分析] CVE-2012-4969[MS12-063] IE execCommand Vuln 赤鬼 DEP Bypass

本帖最后由 blursight 于 2012-10-29 10:43 编辑

本来想自己写这个漏洞的利用,但是加载调试后发现自己能力有限,该漏洞在win 7下的漏洞不是很容易,随机化的模块很多,这样给溢出利用带来了很大的难度,之前一只是用OD安装ollyfindaddr.dll插件来找指令的,但是本人的调试环境下用OD调试,eip老是会莫名其妙的跑飞,所以改用Windbg调试,用windbg调试目前我还没有找到搜索指令的方法,所以决定分析一下牛人做好的poc,领悟一下过dep的过程,也膜拜一下写exploit的大神们!
       接之前的分析,溢出产生在call dword ptr [eax+8]处,溢出后,poc第一个地址在0x7c348b05,故在该处下断点,如下图:
1.jpg
2012-10-29 18:09

      此时可以看到0x7c348b05处xchg  eax,esp指令给esp赋值,这样才能到我们通过堆喷射事先在内存中设计好的shellcode中,之所以选择0x7c348b05地址,是因为该地址所在的模块是没有进行地址随机化的,这样每次溢出后能够稳定利用,如图:
2.jpg
2012-10-29 18:09

0x7c340000处加载的MSVCR71模块是没有地址随机化的,该模块来自于jre 6.0,所以该漏洞的稳定利用一定要安装jre 6.0。
执行了xchg后,esp就为0x0c0c0c0c,此时我们就可以构造rop链来过dep保护了。
3.jpg
2012-10-29 18:10

ret指令后到了0x7c341ae4处执行,如下图
4.jpg
2012-10-29 18:12

0x7c341ae4处的指令是对esp进行调整,这样留出空间,以备后面调试需要。执行完后esp到了0x0c0c0c58处
5.jpg
2012-10-29 18:12

ret返回后执行0x7c37653d处指令 ,pop eax-->fffff000,pop edi-->7c347f98,这个将是后面pushad指令放置完virtualprotect函数参数后将要返回地址,
pop esi-->7c3415a2也是后面要返回的地址,pop ebx-->ffffffff,pop ebp-->7c376402,ret后eip跳转到0x7c351e05处
6.jpg
2012-10-29 18:13

可见,neg   eax后,eax的值为0x1000,有什么用?后面看看!继续执行ret指令后,eip跳转到0x7c345255
7.jpg
2012-10-29 18:13

继续执行inc ebx后,ebx的值变成了0,继续执行ret后,eip跳转到0x7c352174处
8.jpg
2012-10-29 18:13

add ebx,eax后,ebx的值为0x1000 ,0x1000作为后面virtulprotect函数的参数,inc eax后,eax为1,继续执行ret后,eip跳转到0x7c344f87处
9.jpg
2012-10-29 18:13

pop edx-->ffffffc0, 继续执行ret指令后,eip跳转到0x7c351eb1
10.jpg
2012-10-29 18:14

neg edx后,edx的值为0x40,0x40作为后面virtulprotect函数的参数,ret后,eip跳转到0x7c34d201处
pop ecx-->0x7c38b001,ret后,eip跳转到0x7c347f97
11.jpg
2012-10-29 18:14

pop eax-->0x7c37a151,ret后,eip跳转到0x7c378c81处
12.jpg
2012-10-29 18:14

pushad指令调用前,该指令主要涉及到的寄存器为:
eax=0x7c37a151, ecx=0x7c38b001, edx=0x40, ebx=0x1000 ebp=0x7c376402 esi=0x7c3415a2 edi=0x7c347f98 esp=0xc0c0c9c
按照push eax,push ecx,push edx,push ebx,push ebp,push esi,push edi的顺序压栈。
ret后,eip跳转到0x7c347f98处
13.jpg
2012-10-29 18:15

ret后,eip跳转到0x7c3415a2处
14.jpg
2012-10-29 18:15

经过前面add   al,0EFh指令后,eax=0x7c37a140,[eax]=0x76c82bcd 正好为virtualprotect函数地址。(但是我始终不明白为什么不给eax直接赋值成该值,然后找一个call eax指令呢,可能是在该dll中没有找到这个call eax指令吧!)所以不得不佩服作者设计的巧妙,可见马上要调用VirtualProtect函数突破dep保护了
15.jpg
2012-10-29 18:15

此时esp的情况如图
16.jpg
2012-10-29 18:15

pop ebx-->0x7c376402
继续执行到0x75c1f306
17.jpg
2012-10-29 18:16

mov ebp,esp后ebp为0x0c0c0c80
18.jpg
2012-10-29 18:16

      VirtualProtectEx( ffffffff, 0c0c0c9c, 00001000, 00000040, 7c38b001)调用改函数后就把0c0c0c9c处开始的0x1000字节的内存空间改成了可执行,这样就顺利的突破了dep保护。后面分析就没有难度了。
      
       通过调试发现,在win 7 下突破dep保护一定要先确定那些库是没有随机化的,要在这些没有随机化的库里面找指令,当找不到我们理想的指令时,要用效果等价的指令代替,像这个例子一样,通过pop指令给寄存器赋值,然后通过pushad指令把改好的寄存器指令顺序压栈,这样来完成调用突破dep保护函数参数的压栈,这样达到突破dep保护的目的。本次调试的poc设计的非常之精巧,耐人寻味啊!

申精!

TOP

楼主根据板块规则,修改下标题吧。主要注明漏洞编号,方便他人查找。
wWw.BinVul.Com
Binary Vulnerability Research

TOP

回复 3# h4ckmp


   谢谢版主提醒!期待版主给个精华!

TOP

帮你改好了。

TOP

回复 5# blursight


    谢谢,好专业啊!

TOP

好专业,好好学习学习

TOP

好文呀,。。

TOP

版主给个精吧!小弟渴望升级啊!

TOP

回复 9# leeyth


    加精

TOP