BinVul's Archiver

leeyth 发表于 2012-10-29 18:17

CVE-2012-4969[MS12-063] IE execCommand Vuln 赤鬼 DEP Bypass

[i=s] 本帖最后由 blursight 于 2012-10-29 10:43 编辑 [/i]

本来想自己写这个漏洞的利用,但是加载调试后发现自己能力有限,该漏洞在win 7下的漏洞不是很容易,随机化的模块很多,这样给溢出利用带来了很大的难度,之前一只是用OD安装ollyfindaddr.dll插件来找指令的,但是本人的调试环境下用OD调试,eip老是会莫名其妙的跑飞,所以改用Windbg调试,用windbg调试目前我还没有找到搜索指令的方法,所以决定分析一下牛人做好的poc,领悟一下过dep的过程,也膜拜一下写exploit的大神们!
       接之前的分析,溢出产生在call dword ptr [eax+8]处,溢出后,poc第一个地址在0x7c348b05,故在该处下断点,如下图:
[attach]220[/attach]
      此时可以看到0x7c348b05处xchg  eax,esp指令给esp赋值,这样才能到我们通过堆喷射事先在内存中设计好的shellcode中,之所以选择0x7c348b05地址,是因为该地址所在的模块是没有进行地址随机化的,这样每次溢出后能够稳定利用,如图:
[attach]221[/attach]
0x7c340000处加载的MSVCR71模块是没有地址随机化的,该模块来自于jre 6.0,所以该漏洞的稳定利用一定要安装jre 6.0。
执行了xchg后,esp就为0x0c0c0c0c,此时我们就可以构造rop链来过dep保护了。
[attach]222[/attach]
ret指令后到了0x7c341ae4处执行,如下图
[attach]223[/attach]
0x7c341ae4处的指令是对esp进行调整,这样留出空间,以备后面调试需要。执行完后esp到了0x0c0c0c58处
[attach]224[/attach]
ret返回后执行0x7c37653d处指令 ,pop eax-->fffff000,pop edi-->7c347f98,这个将是后面pushad指令放置完virtualprotect函数参数后将要返回地址,
pop esi-->7c3415a2也是后面要返回的地址,pop ebx-->ffffffff,pop ebp-->7c376402,ret后eip跳转到0x7c351e05处
[attach]225[/attach]
可见,neg   eax后,eax的值为0x1000,有什么用?后面看看!继续执行ret指令后,eip跳转到0x7c345255
[attach]226[/attach]
继续执行inc ebx后,ebx的值变成了0,继续执行ret后,eip跳转到0x7c352174处
[attach]227[/attach]
add ebx,eax后,ebx的值为0x1000 ,0x1000作为后面virtulprotect函数的参数,inc eax后,eax为1,继续执行ret后,eip跳转到0x7c344f87处
[attach]228[/attach]
pop edx-->ffffffc0, 继续执行ret指令后,eip跳转到0x7c351eb1
[attach]229[/attach]
neg edx后,edx的值为0x40,0x40作为后面virtulprotect函数的参数,ret后,eip跳转到0x7c34d201处
pop ecx-->0x7c38b001,ret后,eip跳转到0x7c347f97
[attach]230[/attach]
pop eax-->0x7c37a151,ret后,eip跳转到0x7c378c81处
[attach]231[/attach]
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处
[attach]232[/attach]
ret后,eip跳转到0x7c3415a2处
[attach]233[/attach]
经过前面add   al,0EFh指令后,eax=0x7c37a140,[eax]=0x76c82bcd 正好为virtualprotect函数地址。(但是我始终不明白为什么不给eax直接赋值成该值,然后找一个call eax指令呢,可能是在该dll中没有找到这个call eax指令吧!)所以不得不佩服作者设计的巧妙,可见马上要调用VirtualProtect函数突破dep保护了
[attach]234[/attach]
此时esp的情况如图
[attach]235[/attach]
pop ebx-->0x7c376402
继续执行到0x75c1f306
[attach]236[/attach]
mov ebp,esp后ebp为0x0c0c0c80
[attach]237[/attach]
      VirtualProtectEx( ffffffff, 0c0c0c9c, 00001000, 00000040, 7c38b001)调用改函数后就把0c0c0c9c处开始的0x1000字节的内存空间改成了可执行,这样就顺利的突破了dep保护。后面分析就没有难度了。
      
       通过调试发现,在win 7 下突破dep保护一定要先确定那些库是没有随机化的,要在这些没有随机化的库里面找指令,当找不到我们理想的指令时,要用效果等价的指令代替,像这个例子一样,通过pop指令给寄存器赋值,然后通过pushad指令把改好的寄存器指令顺序压栈,这样来完成调用突破dep保护函数参数的压栈,这样达到突破dep保护的目的。本次调试的poc设计的非常之精巧,耐人寻味啊!

leeyth 发表于 2012-10-29 18:18

申精!:D

h4ckmp 发表于 2012-10-29 18:30

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

leeyth 发表于 2012-10-29 18:40

[b]回复 [url=http://www.binvul.com/redirect.php?goto=findpost&pid=826&ptid=207]3#[/url] [i]h4ckmp[/i] [/b]


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

blursight 发表于 2012-10-29 18:44

帮你改好了。

leeyth 发表于 2012-10-29 18:46

[b]回复 [url=http://www.binvul.com/redirect.php?goto=findpost&pid=829&ptid=207]5#[/url] [i]blursight[/i] [/b]


    谢谢,好专业啊!

俊虎 发表于 2012-10-31 11:24

好专业,好好学习学习

cnbug 发表于 2012-10-31 20:33

好文呀,。。

leeyth 发表于 2012-11-14 11:18

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

chuyuantemp 发表于 2013-10-26 11:33

[b]回复 [url=http://www.binvul.com/redirect.php?goto=findpost&pid=925&ptid=207]9#[/url] [i]leeyth[/i] [/b]


    加精

Ox9A82 发表于 2016-8-17 10:42

ROP构造的很巧妙:dizzy:

页: [1]

Powered by Discuz! Archiver 7.2  © 2001-2009 Comsenz Inc.