首页
社区
课程
招聘
[原创]cve-2012-4969 ie_execcommand漏洞调试分析(dep突破分析,仅仅调试了拿到的poc,膜拜写此exploit的牛人)
2012-11-5 10:04 7377

[原创]cve-2012-4969 ie_execcommand漏洞调试分析(dep突破分析,仅仅调试了拿到的poc,膜拜写此exploit的牛人)

2012-11-5 10:04
7377
本来想自己写这个漏洞的利用,但是加载调试后发现自己能力有限,该漏洞在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设计的非常之精巧,耐人寻味啊!

[培训]二进制漏洞攻防(第3期);满10人开班;模糊测试与工具使用二次开发;网络协议漏洞挖掘;Linux内核漏洞挖掘与利用;AOSP漏洞挖掘与利用;代码审计。

上传的附件:
收藏
点赞3
打赏
分享
最新回复 (9)
雪    币: 429
活跃值: (1875)
能力值: ( LV17,RANK:1820 )
在线值:
发帖
回帖
粉丝
riusksk 41 2012-11-5 11:53
2
0
接之前的分析,溢出产生在call dword ptr [eax+8]处,溢出后,poc第一个地址在0x7c348b05,故在该处下断点,如下图:……

这漏洞不是溢出吧,是释放重引用(use after free)
雪    币: 232
活跃值: (40)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
arjohn 2012-11-5 14:27
3
0
谢谢大神提醒!
雪    币: 34
活跃值: (40)
能力值: ( LV5,RANK:60 )
在线值:
发帖
回帖
粉丝
冰翼show 1 2012-11-5 16:15
4
0
顶个
雪    币: 159
活跃值: (40)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
PEYlxZ 2012-11-6 12:03
5
0
说好的exploit POC了
雪    币: 1489
活跃值: (955)
能力值: (RANK:860 )
在线值:
发帖
回帖
粉丝
仙果 19 2012-11-6 15:00
6
0
试下
dds esp

这条 Windbg的命令,查看参数会更清楚一些
雪    币: 1489
活跃值: (955)
能力值: (RANK:860 )
在线值:
发帖
回帖
粉丝
仙果 19 2012-11-6 15:02
7
0
MSVCR71.dll这个文件中是完全可以找到ROP链的代码,而不像POC中那样使用neg reg 这样的指令,楼主可以尝试自己查找一下,写一个自己的ROP 链
雪    币: 232
活跃值: (40)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
arjohn 2012-11-6 21:09
8
0
谢谢版主!我试试看!
雪    币: 81
活跃值: (165)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
idhyt 2012-11-22 13:42
9
0
[QUOTE=arjohn;1115078]经过前面add al,0EFh指令后,eax=0x7c37a140,[eax]=0x76c82bcd 正好为virtualprotect函数地址。(但是我始终不明白为什么不给eax直接赋值成该值,然后找一个call eax指令呢,可能是在该dll中没有找到这个call eax指令吧!)所以不得不佩服作者设计的巧妙,可见马上要调用VirtualProtect函数突破dep保护了[/QUOTE]

这个问题是这样的:
如果直接call eax的话,会先将地址压栈,然后在调用成功返回就失去控制权了,test eax,eax之前会跳走。你可以自己调下试试。
雪    币: 62
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
南宫世家 2013-1-10 15:50
10
0
RT。。。。
游客
登录 | 注册 方可回帖
返回