漏洞复现分析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漏洞复现
- 在Windows xp系统中安装必要软件,如图 1;

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

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

1.2.4漏洞分析
- PDF文件
PDF文件格式
一个PDF文件由多个部分组成,通常包括以下几个主要部分:
文件头(Header);对象(Objects);交叉引用表(Cross-Reference Table, xref);文件尾(Trailer);页面树(Page Tree)
使用PdfStreamDumper.exe打开漏洞PDF可以看到其结构,如图 4

PDF 文件的工作原理
PDF文件结构是线性化的,即各个部分按顺序排列,便于顺序读取和显示。然而,PDF文件通常采用一个索引机制(交叉引用表),使得文件可以随机访问。通过文件尾指向交叉引用表的位置,PDF阅读器可以快速定位并加载特定对象,显示页面内容。
- 前期准备
重点看看 /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 字段的长度,导致缓冲区溢出。
- 使用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 字符串起始地址
- 使用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漏洞复现与分析
- 通过 metasploit 来构造RTF样本
打开kali找到样本
msfconsole
search CVE-2010-3333
use exploit/windows/fileformat/ms10_087_rtf_pfragments_bof

Info查看信息


获得样本文件
- Windbg获取崩溃点

使用 Windbg 载入--附加进程


输入 g 运行word 打开RTF样本
winDBG产生崩溃代码c000005(内存禁止访问)栈溢出,溢出位置 mso.dll,溢出语句位置 30ed14eb

- 分析崩溃点函数栈帧
重新打开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
- 分析利用过程
崩溃点:
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 距离很近容易造成栈溢出

浙公网安备 33010602011771号