漏洞复现分析1

一、漏洞复现分析

1. 栈溢出漏洞分析

1.1栈溢出漏洞相关知识

1.1.1栈的基本概念

栈(stack)是一种数据结构,用于存储程序在执行过程中需要用到的临时数据,如函数的局部变量、函数返回地址、参数等。栈的特点是“后进先出”(Last In, First Out, LIFO),即最后一个被压入栈的数据最先被弹出。

1.1.2栈溢出漏洞的原理

栈溢出漏洞(Stack Overflow Vulnerability)是计算机安全领域的一种常见漏洞,它发生在程序向栈中写入数据时,超过了栈的边界,导致内存中紧邻栈的数据被意外覆盖。这种情况通常是由于缺乏适当的边界检查而引起的。

1.2 CVE-2010-2883分析

1.2.1漏洞描述

CVE-2010-2883是Adobe Reader和Acrobat中的CoolType.dll库在解析字体文件SING表中的uniqueName项时存在的栈溢出漏洞,用户受骗打开了特制的PDF文件就有可能导致执行任意代码。

1.2.2分析环境

表 1

实验环境

操作系统

Windows xp SP3

渗透工具

kali-linux-2022-metasploit

虚拟机

VMware® Workstation 16 Pro

调试器

OllyDbg

反汇编器

IDA Pro 5.5

漏洞软件

Adobe Reader 9.3.4

1.2.3漏洞复现

  1. 在Windows xp系统中安装必要软件,如图 1;

图 1

  1. 使用Kali-metasploit生成对应漏洞利用文档,如图 2;

图 2

  1. 在Windows xp系统中打开文件,如图 3;结果为打开计算器,可以理解为恶意软件。

图 3

1.2.4漏洞分析

  1. PDF文件

PDF文件格式

一个PDF文件由多个部分组成,通常包括以下几个主要部分:

文件头(Header);对象(Objects);交叉引用表(Cross-Reference Table, xref);文件尾(Trailer);页面树(Page Tree)

使用PdfStreamDumper.exe打开漏洞PDF可以看到其结构,如图 4

图 4

PDF 文件的工作原理

PDF文件结构是线性化的,即各个部分按顺序排列,便于顺序读取和显示。然而,PDF文件通常采用一个索引机制(交叉引用表),使得文件可以随机访问。通过文件尾指向交叉引用表的位置,PDF阅读器可以快速定位并加载特定对象,显示页面内容。

  1. 前期准备

重点看看 /Resources 指向的一个资源对象40R,它是漏洞触发的对象。其对象序号为 4,其中 /Font条目指向了一个字体字典对象60R。

图 5

继续查看序号为 6 的对象。/F1代表了使用Type 1字体技术定义字形形状的字体。

查看 7 0 R,其中的 /FontDescriptor 指向了一个字体描述器 9 0 R,用于描述字体各种属性。

查看 9 0 R ,该对象中的 /FontFile2 指向一个流对象 10 0 R,该对象就是触发漏洞的字体对象。

图 6

图6中的 00 01 00 00 是 ttf 字体文件的开始标志。

TrueType 字体文件以表格格式包含构成字体的数据。下面图7是各表的作用

图 7

展开 010editor ttf 文件中的表,可以看到有一个 SING 表,该表就是漏洞触发点。但在字体文档里面没有这个表的资料,github 上的开源库中有这个表的定义。

https://github.com/adobe-type-tools/afdko/blob/develop/c/spot/sfnt_includes/sfnt_SING.h

#ifndef FORMAT_SING_H

#define FORMAT_SING_H

#define SING_VERSION VERSION(1, 1)

#define SING_UNIQUENAMELEN 28

#define SING_MD5LEN 16

typedef struct

{

Card16 tableVersionMajor;

Card16 tableVersionMinor;

Card16 glyphletVersion;

Card16 permissions;

Card16 mainGID;

Card16 unitsPerEm;

Int16 vertAdvance;

Int16 vertOrigin;

Card8 uniqueName[SING_UNIQUENAMELEN];

Card8 METAMD5[SING_MD5LEN];

Card8 nameLength;

Card8 *baseGlyphName; /* name array */

} SINGTbl;

其中的 Card16 就是 USHORT 类型,16位大小,Card8 就是 byte 类型或 char 类型,8位大小。其中的 uniqueName 字段长度为 28 字节,漏洞触发的原因是 CoolType.dll 在复制 uniqueName 字段到缓冲区时,没有检查 uniqueName 字段的长度,导致缓冲区溢出。

  1. 使用IDA对CoolType.dll静态分析

找到出问题的Dll,用 ida 打开进行反汇编。

图 8

打开 ida 的导入表视图,ctrl+f 搜索 strcat 函数,双击函数

图 9

在 strcat 函数处按 X 打开交叉引用表

图 10

在 sub_803DCF9+B2 处的引用就是存在漏洞的地方步入

图 11

汇编代码中在 803DD74 处引用了 SING 字符串,在 803DDAB 处调用了 strcat 函数。

strcat 函数的定义如下:

char *strcat(char *dest, const char *src);

图 12

参数:dest 为目的字符串指针,src 为源字符串指针。

strcat() 会将参数 src 字符串复制到参数 dest 所指的字符串尾部;dest 最后的结束字符 NULL 会被覆盖掉,并在连接后的字符串的尾部再增加一个 NULL。

注意:dest 与 src 所指的内存空间不能重叠,且 dest 要有足够的空间来容纳要复制的字符串。

返回值:返回dest 字符串起始地址

  1. 使用OllyDBG分析栈溢出过程

用 ollydbg 打开,先在三个关键位置下断点,首先在引用 singTable 处下个断点,便于观察内存中 singTable 的内容。

图 13

第一处断点地址为 0x0803DD82 。在 ollydbg 界面上按 Ctrl + g, 输入 803DD82 ,点击确定,跳到该地址的汇编代码

图 14

在该处的汇编代码左边的十六进制显示区域双击下一个断点。接着在调用 strcat() 函数溢出前下一个断点,地址为 0x0803DDAB接下来在触发漏洞的位置下一个断点,该位置从溢出处一直跟踪即可发现,地址为 0x0808B308

用 ollydbg 打开的 Adobe Reader 打开 漏洞pdf 文件打开后等几秒,会断在了第三个断点处

此时 eax 寄存器的值为 0x12E6D0,也就是栈上的一个地址,此时栈顶为 0x12E2D8。会取 eax 指向的地址的值来作为函数调用,在 eax 处右键,选择堆栈窗口中跟随

图 15

分析漏洞成因:

通过双击定位进入反汇编界面,找到该dll对于SING字体的解析方式,可以发现是由于strcat这个函数造成的溢出漏洞。

可以发现在地址为0x0803DDAB的位置调用了strcat函数,通过查询资料,找到strcat的函数原型如下:char strcat(char dest, const char src);strcat函数将src字符串附加到dest字符串的末尾,覆盖dest末尾的空字符(NULL),并在连接后的字符串末尾添加一个新的空字符。漏洞的根本原因在于没有验证src的长度是否会超出dest数组的大小。如果src的长度超过了dest数组的容量,在调用strcat时可能会导致缓冲区溢出,从而覆盖栈内存,进而可能被利用来执行任意代码。

1.3 CVE-2010-3333分析

1.3.1漏洞描述

Microsoft Office XP SP3、Office 2003 SP3、Office 2007 SP2、Office 2010等多个版本的Office软件中的Open XML文件格式转换器存在栈溢出漏洞,主要是在处理RTF中的“pFragments”属性时存在栈溢出,导致远程攻击者可以借助特制的RTF数据执行任意代码,因此该漏洞又名“RTF栈缓冲区溢出漏洞”

1.3.2分析环境

表 2

实验环境

操作系统

Windows xp SP3

渗透工具

kali-linux-2022-metasploit

虚拟机

VMware® Workstation 16 Pro

调试器

Windbg:6.12.0002.633 x86

漏洞软件

Microsoft Office 2003

1.3.3漏洞复现与分析

  1. 通过 metasploit 来构造RTF样本

打开kali找到样本

msfconsole

search CVE-2010-3333

use exploit/windows/fileformat/ms10_087_rtf_pfragments_bof

Info查看信息

获得样本文件

  1. Windbg获取崩溃点

使用 Windbg 载入--附加进程

输入 g 运行word 打开RTF样本

winDBG产生崩溃代码c000005(内存禁止访问)栈溢出,溢出位置 mso.dll,溢出语句位置 30ed14eb

  1. 分析崩溃点函数栈帧

重新打开word并用winDBG附加,在崩溃位置设置断点 bp 30ed14eb;随后运行

输入kb查看栈帧

使用uf mso!Ordinal2118+0x26d8,查看函数

重新打开在函数位置下两个断点 Bp 30f0da9a;bp 30ed14eb

然后 g 继续打开样本文件;停在断点,单步步过

单步查找函数,怀疑上述函数mso!Ordinal3634+0x11b (30d29e00)

崩溃点:

Breakpoint 1 hit

eax=0000c8ac ebx=05000000 ecx=0000322b edx=00000000 esi=1104000c edi=0012a2c8

eip=30ed14eb esp=0012a2a0 ebp=0012a2d8 iopl=0 nv up ei pl nz ac pe nc

cs=001b ss=0023 ds=0023 es=0023 fs=003b gs=0000 efl=00000216

mso!Ordinal3155+0x5c7:

30ed14eb f3a5 rep movs dword ptr es:[edi],dword ptr [esi]

db esi查看内容:为POC数据

1104000c 41 61 30 41 61 31 41 61-32 41 61 33 41 61 34 41 Aa0Aa1Aa2Aa3Aa4A

1104001c 61 35 41 61 36 41 61 37-41 61 38 41 61 39 41 62 a5Aa6Aa7Aa8Aa9Ab

1104002c 30 41 62 31 41 62 32 41-62 33 41 62 34 41 62 35 0Ab1Ab2Ab3Ab4Ab5

1104003c 41 62 36 41 62 37 41 62-38 41 62 39 41 63 30 41 Ab6Ab7Ab8Ab9Ac0A

1104004c 63 31 41 63 32 41 63 33-41 63 34 41 63 35 41 63 c1Ac2Ac3Ac4Ac5Ac

1104005c 36 41 63 37 41 63 38 41-63 39 41 64 30 41 64 31 6Ac7Ac8Ac9Ad0Ad1

1104006c 41 64 32 41 64 33 41 64-34 41 64 35 41 64 36 41 Ad2Ad3Ad4Ad5Ad6A

1104007c 64 37 41 64 38 41 64 39-41 65 30 41 65 31 41 65 d7Ad8Ad9Ae0Ae1Ae

  1. 分析利用过程

崩溃点:

Breakpoint 1 hit

eax=0000c8ac ebx=05000000 ecx=0000322b edx=00000000 esi=1104000c edi=0012a2c8

eip=30ed14eb esp=0012a2a0 ebp=0012a2d8 iopl=0 nv up ei pl nz ac pe nc

cs=001b ss=0023 ds=0023 es=0023 fs=003b gs=0000 efl=00000216

mso!Ordinal3155+0x5c7:

30ed14eb f3a5 rep movs dword ptr es:[edi],dword ptr [esi]

由于 ebp=0012a2d8和esi=1104000c 距离很近容易造成栈溢出

posted @ 2024-10-19 11:20  风花赏秋月  阅读(111)  评论(0)    收藏  举报