数据溢出的原因和结果(栈溢出漏洞在Excel2003下利用分析)

数据溢出的原因和结果(栈溢出漏洞在Excel2003下利用分析)(1)

最近在研究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
漏洞软件Microsoft Office 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样本文件,打开后触发异常:

数据溢出的原因和结果(栈溢出漏洞在Excel2003下利用分析)(2)

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

数据溢出的原因和结果(栈溢出漏洞在Excel2003下利用分析)(3)

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

数据溢出的原因和结果(栈溢出漏洞在Excel2003下利用分析)(4)

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

数据溢出的原因和结果(栈溢出漏洞在Excel2003下利用分析)(5)

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

数据溢出的原因和结果(栈溢出漏洞在Excel2003下利用分析)(6)

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

单步执行到该段程序的末尾处Retn 0c处时,此时栈如图:

数据溢出的原因和结果(栈溢出漏洞在Excel2003下利用分析)(7)

此时ESP值为0x001379EC。

通过向上回溯代码,发现该段函数开始于0x300CE380,因此定义该函数为sub_300CE380:

数据溢出的原因和结果(栈溢出漏洞在Excel2003下利用分析)(8)

从Call Stack中可以看出,函数sub_300CE380被函数sub_306DF0DC调用:

数据溢出的原因和结果(栈溢出漏洞在Excel2003下利用分析)(9)

为了找出异常发生地址所在函数sub_300CE252与sub_300CE380之间的调用关系,我们再次回到sub_300CE252函数开头,F8单步执行,同时注意观察栈中0x0013AA90的数据变化情况。

执行CALL EXCEL.306DEEFE之前:

数据溢出的原因和结果(栈溢出漏洞在Excel2003下利用分析)(10)

此时栈中0013AA90中的内容仍为正常的返回地址:

数据溢出的原因和结果(栈溢出漏洞在Excel2003下利用分析)(11)

当执行完0x302188D8处CALL EXCEL.306DEEFE后,0x0013AA90处内容被覆写:

数据溢出的原因和结果(栈溢出漏洞在Excel2003下利用分析)(12)

观察此时函数Call Stack:

数据溢出的原因和结果(栈溢出漏洞在Excel2003下利用分析)(13)

可以看出,函数sub_306DEEFE由函数sub_302188D8调用。

重复以上步骤,从sub_300CE252开始,执行到0x300CE30C处执行JE EXCEL.302188B5,跳转到0x302188B5处,单步执行到0x302188D8处调用CALL EXCEL.306DEEFE,结合前面对sub_300CE380 Call Stack的分析,单步执行并在0x306DF0DC处下断点,执行CALL EXCEL.300CE380,继续单步执行,执行完0x300CE3C8处的REP MOVS后,sub_300CE252的返回地址被覆写。

数据溢出的原因和结果(栈溢出漏洞在Excel2003下利用分析)(14)

执行跳转

数据溢出的原因和结果(栈溢出漏洞在Excel2003下利用分析)(15)

调用EXCEL.306DEEFE

数据溢出的原因和结果(栈溢出漏洞在Excel2003下利用分析)(16)

进入EXCEL.306DEEFE代码段

数据溢出的原因和结果(栈溢出漏洞在Excel2003下利用分析)(17)

调用EXCEL.300CE380

数据溢出的原因和结果(栈溢出漏洞在Excel2003下利用分析)(18)

执行0x300CE3C8处的REP MOVS

通过以上调试过程,可以得知sub_300CE252、sub_300CE380、sub_306DF0DC、sub_306DEEFE和sub_302188D8之间的调用关系为:

sub_300CE25

数据溢出的原因和结果(栈溢出漏洞在Excel2003下利用分析)(19)

0x302188B5

sub_302188D8

数据溢出的原因和结果(栈溢出漏洞在Excel2003下利用分析)(20)

sub_306DEEFE

sub_306DF0DC

数据溢出的原因和结果(栈溢出漏洞在Excel2003下利用分析)(21)

sub_300CE380

0x 300CE3C8

三、样本分析

用HexEditor2.exe打开样本exploit.xlb,发现在0000000610附近出现recordType、recordLength等字段的值(\xA7\x00,\x04\x00),0000000620附近出现0x326551EE(EXCEL 2007下CALL ESP指令地址)。

数据溢出的原因和结果(栈溢出漏洞在Excel2003下利用分析)(22)

我们现在的目标是使指令执行到sub_300CE252函数的末尾处(retn),按F9执行,当执行到0x300CE361处的MOV DWORD PTR DS:[EAX],ECX时出现访问违例:访问到一个不可写的地址0x51453844,此时EAX=0x51453844,向上回溯程序,找出EAX的赋值处,发现在0x300CE354处出现给EAX赋值的操作: MOV EAX, DWORD PTR SS:[EBP 2C],此时EBP=0x0013AA8C,EBP 2C=0x0013AAB8,0x0013AAB8处的值恰好是0x51453844。观察栈中的数据,51453844恰好又是shellcode中的数据。

数据溢出的原因和结果(栈溢出漏洞在Excel2003下利用分析)(23)

因此考虑,在shellcode前面继续添加0x90,同时确保返回地址0x0013AA90处的值为EXCEL2003下的跳板指令CALL ESP的地址0x300F2903, 因为函数sub_300CE252末尾为retn 2C,即跳板地址和shellcode之间有0x30个字节的空间(shellcode的开头地址应该为0x0013AAC0>0x0013AAB8),所以不妨将0x0013AAB8处的值填充为一个可写的内存地址(如0x001379E4)。这样,既解决了访问违例的问题,又不会影响shellcode的执行。

数据溢出的原因和结果(栈溢出漏洞在Excel2003下利用分析)(24)

修改样本数据后,重新用EXCEL2003打开,弹出了计算器。

数据溢出的原因和结果(栈溢出漏洞在Excel2003下利用分析)(25)

,

免责声明:本文仅代表文章作者的个人观点,与本站无关。其原创性、真实性以及文中陈述文字和内容未经本站证实,对本文以及其中全部或者部分内容文字的真实性、完整性和原创性本站不作任何保证或承诺,请读者仅作参考,并自行核实相关内容。文章投诉邮箱:anhduc.ph@yahoo.com

    分享
    投诉
    首页