最近在研究CVE-2011-0104栈溢出漏洞,学习了《漏洞战争》中关于该漏洞的分析,书中介绍了Excel 2003 下利用已公布的PoC代码触发异常、下断点定位导致溢出的复制操作位置以及基于污点追踪的漏洞分析方法,但是对如何在Excel 2003下如何利用该漏洞没有做更加深入的分析,同时abysssec组织提供的漏洞样本也是基于Excel 2007 (xp) SP2的。笔者在学习该篇文章的基础上,动手进行了调试,通过定位字符串复制操作、分析函数调用栈、修改样本数据、修复异常,成功完成了Excel2003下该漏洞的利用,弹出了计算器。现将该调试分析过程发布出来,供学习交流。
一、分析环境
推荐使用环境
备注
操作系统
Windows xp
简体中文版
虚拟机
VMware Workstation
版本号:12.1.1 build
调试器
Immunity Debugger
版本号:V1.73
调试器
WinDbg
版本号:6.12.0002.633
漏洞软件
MicrosoftOffice Excel
版本号:2003 11.5612.6568
二、分析调试过程
运行excel.exe,然后用WinDbg附加excel2003进程,在命令输入框中按g,使excel2003运行出现打开后的界面,打开exploit.xlb样本文件,打开后触发异常:
(e48.e4c): Access violation - code c0000005 (first chance)
First chance exceptions are reported before any exception handling.
This exception may be expected and handled.
eax=51453844 ebx=00000002 ecx=00000006 edx=3161feb0 esi=00000000 edi=00000400
eip=300ce361 esp=0013aa24 ebp=0013aa8c iopl=0 nv up ei pl nz na pe nc
cs=001b ss=0023 ds=0023 es=0023 fs=003b gs=0000 efl=00010206
*** ERROR: Symbol file could not be found. Defaulted to export symbols for C:\Program Files\Microsoft Office\OFFICE11\EXCEL.EXE -
EXCEL!Ordinal41+0xce361:
300ce361 8908 mov dword ptr [eax],ecx ds:0023:51453844=????????
0:000> kb
ChildEBP RetAddr Args to Child
WARNING: Stack unwind information not available. Following frames may be wrong.
0013aa8c 30424232 42414242 41385058 494a7542 EXCEL!Ordinal41+0xce361
0013aa90 42414242 41385058 494a7542 584b4c4b EXCEL!Ordinal41+0x424232
0013aa94 41385058 494a7542 584b4c4b 30435451 0x42414242
0013aa98 494a7542 584b4c4b 30435451 50453043 0x41385058
运行excel.exe,然后用Immunity Debugger附加excel2003进程,按F9,使excel2003运行出现打开后的界面,打开exploit.xlb样本文件,打开后触发异常:

通过向上进行代码回溯分析,崩溃地址位于函数sub_300CE252:

然后,在0x300CE252下断点,并对栈顶下内存写入断点(此处的栈顶就是调用sub_300CE252函数时将返回地址压栈时的ESP值,即0x0013AA90):

按F9执行到0x300CE3C8,此处进行循环复制数据到栈上,导致溢出:

此时中断,查看寄存器值发现EBP=0013AA3B,EDI=0013AA9B,复制了0x60个字节:

根据《漏洞战争》P53和P54的分析,REP MOVS 操作的目的地址由ebp提供,由此得知,当复制0x60个字节时edi的值由于递增覆盖到了栈顶(0x0013AA90,此处在漏洞利用中应为“跳板地址”)。
单步执行到该段程序的末尾处Retn 0c处时,此时栈如图:

此时ESP值为0x001379EC。
通过向上回溯代码,发现该段函数开始于0x300CE380,因此定义该函数为sub_300CE380:
[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课