百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 技术流 > 正文

栈溢出漏洞在Excel 2003下利用分析

citgpt 2024-09-07 13:31 8 浏览 0 评论

最近在研究CVE-2011-0104栈溢出漏洞,学习了《漏洞战争》中关于该漏洞的分析,书中介绍了Excel 2003 下利用已公布的PoC代码触发异常、下断点定位导致溢出的复制操作位置以及基于污点追踪的漏洞分析方法,但是对如何在Excel 2003下如何利用该漏洞没有做更加深入的分析,同时abysssec组织提供的漏洞样本也是基于Excel 2007 (xp) SP2的。笔者在学习该篇文章的基础上,动手进行了调试,通过定位字符串复制操作、分析函数调用栈、修改样本数据、修复异常,成功完成了Excel2003下该漏洞的利用,弹出了计算器。现将该调试分析过程发布出来,供学习交流。

栈溢出漏洞在Excel 2003下利用分析

一、分析环境

推荐使用环境备注
操作系统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样本文件,打开后触发异常:

通过向上进行代码回溯分析,崩溃地址位于函数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:

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

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

执行CALL EXCEL.306DEEFE之前:

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

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

观察此时函数Call Stack:

可以看出,函数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的返回地址被覆写。

执行跳转

调用EXCEL.306DEEFE

进入EXCEL.306DEEFE代码段

调用EXCEL.300CE380

执行0x300CE3C8处的REP MOVS

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

sub_300CE25

0x302188B5

sub_302188D8

sub_306DEEFE

sub_306DF0DC

sub_300CE380

0x 300CE3C8

三、样本分析

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

我们现在的目标是使指令执行到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中的数据。

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

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

相关推荐

js中arguments详解

一、简介了解arguments这个对象之前先来认识一下javascript的一些功能:其实Javascript并没有重载函数的功能,但是Arguments对象能够模拟重载。Javascrip中每个函数...

firewall-cmd 常用命令

目录firewalldzone说明firewallzone内容说明firewall-cmd常用参数firewall-cmd常用命令常用命令 回到顶部firewalldzone...

epel-release 是什么

EPEL-release(ExtraPackagesforEnterpriseLinux)是一个软件仓库,它为企业级Linux发行版(如CentOS、RHEL等)提供额外的软件包。以下是关于E...

FullGC详解  什么是 JVM 的 GC
FullGC详解 什么是 JVM 的 GC

前言:背景:一、什么是JVM的GC?JVM(JavaVirtualMachine)。JVM是Java程序的虚拟机,是一种实现Java语言的解...

2024-10-26 08:50 citgpt

使用Spire.Doc组件利用模板导出Word文档
  • 使用Spire.Doc组件利用模板导出Word文档
  • 使用Spire.Doc组件利用模板导出Word文档
  • 使用Spire.Doc组件利用模板导出Word文档
  • 使用Spire.Doc组件利用模板导出Word文档
跨域(CrossOrigin)

1.介绍  1)跨域问题:跨域问题是在网络中,当一个网络的运行脚本(通常时JavaScript)试图访问另一个网络的资源时,如果这两个网络的端口、协议和域名不一致时就会出现跨域问题。    通俗讲...

微服务架构和分布式架构的区别

1、含义不同微服务架构:微服务架构风格是一种将一个单一应用程序开发为一组小型服务的方法,每个服务运行在自己的进程中,服务间通信采用轻量级通信机制(通常用HTTP资源API)。这些服务围绕业务能力构建并...

深入理解与应用CSS clip-path 属性
深入理解与应用CSS clip-path 属性

clip-pathclip-path是什么clip-path 是一个CSS属性,允许开发者创建一个剪切区域,从而决定元素的哪些部分可见,哪些部分会被隐...

2024-10-25 11:51 citgpt

HCNP Routing&Switching之OSPF LSA类型(二)
  • HCNP Routing&Switching之OSPF LSA类型(二)
  • HCNP Routing&Switching之OSPF LSA类型(二)
  • HCNP Routing&Switching之OSPF LSA类型(二)
  • HCNP Routing&Switching之OSPF LSA类型(二)
Redis和Memcached的区别详解
  • Redis和Memcached的区别详解
  • Redis和Memcached的区别详解
  • Redis和Memcached的区别详解
  • Redis和Memcached的区别详解
Request.ServerVariables 大全

Request.ServerVariables("Url")返回服务器地址Request.ServerVariables("Path_Info")客户端提供的路...

python操作Kafka

目录一、python操作kafka1.python使用kafka生产者2.python使用kafka消费者3.使用docker中的kafka二、python操作kafka细...

Runtime.getRuntime().exec详解

Runtime.getRuntime().exec详解概述Runtime.getRuntime().exec用于调用外部可执行程序或系统命令,并重定向外部程序的标准输入、标准输出和标准错误到缓冲池。...

promise.all详解 promise.all是干什么的
promise.all详解 promise.all是干什么的

promise.all详解promise.all中所有的请求成功了,走.then(),在.then()中能得到一个数组,数组中是每个请求resolve抛出的结果...

2024-10-24 16:21 citgpt

Content-Length和Transfer-Encoding详解
  • Content-Length和Transfer-Encoding详解
  • Content-Length和Transfer-Encoding详解
  • Content-Length和Transfer-Encoding详解
  • Content-Length和Transfer-Encoding详解

取消回复欢迎 发表评论: