首页
论坛
课程
招聘
[原创]eXeScope 6.50本地溢出分析
2009-3-30 21:03 21900

[原创]eXeScope 6.50本地溢出分析

2009-3-30 21:03
21900
eXeScope 6.50本地溢出分析

无聊逛了下http://www.milw0rm.com 看最近有什么ODAY没,顺便挑一个分析下玩玩。
于是就看到了这个
http://www.milw0rm.com/exploits/8270
是eXeScope 6.50 Local Buffer Overflow Exploit。

用eXeScope 6.50打开生成的example.exe后弹出了计算器。
看了下他的exploit,感觉比较好理解。为了能找到漏洞发生的原因,我把shellcode前面的90改为cc(我是在example.exe文件偏移11e8处修改的),也就是int3。然后用od载入eXeScope,再用eXeScope打开example.exe,最下面显示堆栈溢出,使用shift+f7/f8/f9 来忽略程序异常。shift+f9执行后就来到这里。

可以看到程序暂停在了004d3258处。下面接着就是shellcode了。可是这个溢出的根本原因是什么呢?
看堆栈处,
004069FA 返回到 eXeScope.@LoadResString+36 来自 <eXeScope.LoadStringA>
看来程序是经过了这个函数后来到此处的。
重新加载一遍,ctrl+g来到004069fa处,在LoadStringA函数上面也就是004069f4处下个断点,然后f7走进去,这时发现
FF25 54324D00 JMP DWORD PTR DS:[<&user32.LoadStringA>] ; LoadStringA
DS:[004D3254]=004D3258 (<&user32.MessageBoxA>)
本地调用来自 @LoadResString+31
导入表被修改了,因为只要执行到004D3258就OVER了。
看来这个漏洞是覆盖了eXeScope的导入表。
不过还没有找到在哪里覆盖了。
还是用windbg再看看吧。先打开eXeScope,接着在命令行下
C:\Program Files\windbg>cdb -pn eXeScope.exe
输入G运行,再用eXeScope打开example.exe,

eXeScope+0x23b6:
004023b6 8b1e mov ebx,dword ptr [esi] ds:0023:4141413d=????????
这里有个内存读取错误。
再输入G运行
(778.6a8): Break instruction exception - code 80000003 (first chance)
eax=00400000 ebx=00407dfc ecx=00000000 edx=004cd0c8 esi=0012f778 edi=00000000
eip=004d3258 esp=0012f1d8 ebp=0012f77c iopl=0 nv up ei pl nz ac po nc
cs=001b ss=0023 ds=0023 es=0023 fs=003b gs=0000 efl=00000212
eXeScope+0xd3258:
004d3258 cc int 3
这里eip指向004d3258了。
看来关键点就是004023b6。这里内存读取错误后,应该有个异常处理的,然后程序才能正常执行下去。

先看004023b6吧。
先运行起来,在打开example.exe的一瞬在004023b6下断点,断下后
.dd 4d3000
004D3000 00000000
004D3004 00000000
004D3008 00000000
004D300C 000D393C
004D3010 000D31A4
004D3014 00000000
004D3018 00000000
004D301C 00000000
004D3020 000D3C2A
004D3024 000D3250
发现导入表现在还没有被覆盖,而我们要找的就是看导入表在哪一刻被覆盖的。

那我就在4d3000处下内存写入断点。
然后把004023b6处断点取消。F9运行之就来到下面了

/*4C70A4*/ PUSH 0
/*4C70A6*/ MOVZX EAX,WORD PTR DS:[4D20EE]
/*4C70AD*/ MOV ECX,EAX
/*4C70AF*/ SHL ECX,3
/*4C70B2*/ LEA ECX,DWORD PTR DS:[ECX+ECX*4]
/*4C70B5*/ MOV EDX,eXeScope.004D2220
/*4C70BA*/ MOV EAX,eXeScope.004D1D8C
/*4C70BF*/ CALL eXeScope.0040302C
/*4C70C4*/ CALL <eXeScope.@@_IOTest>
/*4C70C9*/ MOV EAX,eXeScope.004C75E8
/*4C70CE*/ CALL <eXeScope.@TextToShortCut_0>
/*4C70D3*/ MOV DWORD PTR DS:[4D2C48],EAX
/*4C70D8*/ MOV EAX,DWORD PTR DS:[4D2C78]
/*4C70DD*/ CALL eXeScope.004027BC

从OD注释上看应该是处理资源的时候出的问题。
好,重新来过,在稍微前面点4C70A4处下个断点。经测试发现只要过了
/*4C70BF*/ CALL eXeScope.0040302C
导入表就被覆盖。看来就是call 0040302C出的问题
F7进去仔细看个明白吧。
进去后,又经我人肉测试,发现过了
/*402FBA*/ PUSH 0
/*402FBC*/ LEA EAX,DWORD PTR SS:[EBP-4]
/*402FBF*/ PUSH EAX
/*402FC0*/ MOV EAX,DWORD PTR DS:[EBX+8]
/*402FC3*/ IMUL ESI
/*402FC5*/ PUSH EAX
/*402FC6*/ PUSH EDI
/*402FC7*/ MOV EAX,DWORD PTR DS:[EBX]
/*402FC9*/ PUSH EAX
/*402FCA*/ CALL DWORD PTR SS:[EBP+C]
/*402FCD*/ TEST EAX,EAX

过了/*402FCA*/ CALL DWORD PTR SS:[EBP+C]后导入表就被覆盖

OK,现在问题终于找到了。
就是/*402FCA*/ CALL DWORD PTR SS:[EBP+C]的原因。

可以看到这个函数是<JMP.&kernel32.ReadFile>
他的几个参数分别是
句柄:140
读文件的缓冲区地址004d2220
读的字节大小:00002d78

而导入表起始地址是004d31a4.
004d2220+00002d78=4d4f98
显然超过了导入表的地址,全部覆盖了。

然后作者利用最近使用的导入表函数的地方,也就是LoadStringA,替换成了004d3258,刚好指向shellcode地址。
综上所述,该溢出的根本原因就是/*402FCA*/ CALL DWORD PTR SS:[EBP+C]
处<JMP.&kernel32.ReadFile>在读取资源时没有限制大小,导致构造的数据覆盖了eXeScope的导入表。

最后我不得不佩服作者如此巧妙的利用。另外这个漏洞真有趣,因此记录之.OVER。

附件是POC利用程序,有兴趣的可以测试下自己的eXeScope.

[2022冬季班]《安卓高级研修班(网课)》月薪三万班招生中~

上传的附件:
收藏
点赞0
打赏
分享
最新回复 (14)
雪    币: 337
活跃值: 活跃值 (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
疯子鱼 活跃值 2009-3-31 10:22
2
0
我发现 本站的
http://www.pediy.com/tools/Resource/eXeScope/exesc6.5.zip
下载的eXeScope就有此漏洞啊
雪    币: 367
活跃值: 活跃值 (10)
能力值: ( LV9,RANK:230 )
在线值:
发帖
回帖
粉丝
nba2005 活跃值 5 2009-3-31 12:12
3
0
学习一下分析的思路。。。

难得大侠如此细致的解说。
雪    币: 25331
活跃值: 活跃值 (3382)
能力值: ( LV15,RANK:3306 )
在线值:
发帖
回帖
粉丝
风间仁 活跃值 19 2009-3-31 12:38
4
0
这个要好好学习一下
雪    币: 221
活跃值: 活跃值 (10)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
evilight 活跃值 1 2009-3-31 13:20
5
0
mark 0day 网站也一并收藏
雪    币: 820
活跃值: 活跃值 (182)
能力值: (RANK:500 )
在线值:
发帖
回帖
粉丝
humourkyo 活跃值 12 2009-3-31 20:20
6
0
给它打了个补丁.发上来吧.
毕竟主网站有下载连接的此工具还存在漏洞呢.
上传的附件:
雪    币: 564
活跃值: 活跃值 (23)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
lixupeng 活跃值 2009-4-1 00:01
7
0
学习了
雪    币: 584
活跃值: 活跃值 (11145)
能力值: (RANK:350 )
在线值:
发帖
回帖
粉丝
kanxue 活跃值 8 2009-4-1 10:01
8
0
感谢,将主站的更新了一下。
雪    币: 247
活跃值: 活跃值 (10)
能力值: ( LV9,RANK:420 )
在线值:
发帖
回帖
粉丝
小子贼野 活跃值 10 2009-4-1 19:14
9
0
我是过来膜拜的
雪    币: 83
活跃值: 活跃值 (10)
能力值: ( LV6,RANK:90 )
在线值:
发帖
回帖
粉丝
espzj 活跃值 2 2009-4-2 08:59
10
0
分析得很详细,赞一个。
雪    币: 443
活跃值: 活跃值 (63)
能力值: ( LV5,RANK:75 )
在线值:
发帖
回帖
粉丝
wyfe 活跃值 2009-4-3 23:00
11
0
分析的好,溢出是一个当前热门的话题
雪    币: 200
活跃值: 活跃值 (16)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
Xusually 活跃值 2009-4-4 17:30
12
0
见到0day分析一律膜拜
雪    币: 212
活跃值: 活跃值 (10)
能力值: ( LV6,RANK:90 )
在线值:
发帖
回帖
粉丝
雪雪雪雪 活跃值 2 2009-4-4 22:13
13
0
分析的不错。
但是

这样似乎不妥,
改成IAT是否更恰当。

这个exploit实际上是覆盖了IAT。
当应用程序调用IAT中的地址(本该是系统API函数的地址)时反而去调用我们覆盖的数据(shellcode)了。
雪    币: 30
活跃值: 活跃值 (1131)
能力值: ( LV17,RANK:1820 )
在线值:
发帖
回帖
粉丝
riusksk 活跃值 41 2009-4-6 16:08
14
0
楼主发的补丁,打开之前的exploit后,会弹出一对话框,好像是日文,呵呵
雪    币: 85
活跃值: 活跃值 (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
xygwf 活跃值 2009-4-10 08:54
15
0
直接拖到打开的程序里面就看不到了... 原来的直接是消失的样子吧:)
游客
登录 | 注册 方可回帖
返回