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