安全研究
 安全漏洞 
	Winamp LibSNDFile.DLL组件远程内存破坏漏洞
发布日期:2007-04-06
更新日期:2007-04-09
受影响系统:
Nullsoft Winamp 5.33描述:
BUGTRAQ ID: 23351
Winamp是一款流行的媒体播放器,支持多种文件格式。
Winamp在试图播放特制的.MAT文件时存在内存破坏漏洞,远程攻击者可能利用此漏洞控制处理了恶意.MAT文件的用户机器。
在以下代码段中:
----// SNIP SNIP //-------------------------------------------------
.text:1000CCED cmp [ebp+MY_DWORD], 40h ; (1)
.text:1000CCF1 jl short kont
.text:1000CCF3
.text:1000CCF3 loc_1000CCF3: ; CODE XREF: sub_1000CB3B+BAj
.text:1000CCF3 push 7Ah
.text:1000CCF5 jmp faked
.text:1000CCFA
.text:1000CCFA
.text:1000CCFA kont: ; CODE XREF: sub_1000CB3B+1B6j
.text:1000CCFA push [ebp+MY_DWORD]
.text:1000CCFD lea eax, [ebp+var_64]
.text:1000CD00 push eax
.text:1000CD01 push ebx ; int
.text:1000CD02 push esi ; DistanceToMoveHigh
.text:1000CD03 call sub_10025A28
.text:1000CD08 mov eax, [ebp+MY_DWORD]
.text:1000CD0B mov byte ptr [ebp+eax+var_64], 0 ; (2)
----// SNIP SNIP //-------------------------------------------------
MY_DWORD值是受控的,储存在.mat文件开始起的0x39偏移处。从上面代码可见块(1)非常重要,因为如果MY_DWORD大于或等于0x40的话就不会出现内存覆盖。 在块(2)计算内存地址的方式得出以下基本的数学假设:
1) x < 0x40
2) y = ebp + x - 0x64
其中:
x - 输入参数(MY_DWORD)
y - 最终覆盖地址
然后经过一些简单的计算,就可以得出*y*的范围(最终覆盖地址),因为*x*是受0x40限制的。
这里可以得到:
** y < ebp - 0x64 + 0x40 **
也就是假设EBP = 0x010CFB7C的话,就可以得到:
** y < 0x10CFB58 **
简而言之从MY_DWORD值所计算出的最终地址一定小于0x10CFB58,这就使得攻击仅限于低于0x10CFB58的内存。如果仅考虑同目标进程一同加载的模块的话,就会得到一些符合上述条件的:
----// SNIP SNIP //-------------------------------------------------
Executable modules
Base Size Entry Name File version Path
00400000 00125000 0045FD3E winamp 5,3,3,1100 winamp.exe
00C70000 00012000 00C7D8B5 png png.w5s
00C90000 00056000 00C9229F MSVCR71 7.10.3052.4 MSVCR71.dll
00D00000 0005E000 00D1ADD2 in_APE 3.99 in_APE.dll
00E00000 0004F000 00E0E54E in_cdda in_cdda.dll
00E50000 0001B000 00E5F124 in_midi in_midi.dll
00E70000 0001B000 00E80FFC read_fil read_file.dll
00E90000 0002B000 00EA77EF in_mod in_mod.dll
00EC0000 00008000 00EC3B89 in_mp4 in_mp4.dll
00ED0000 00028000 00EE7CF2 libmp4v2 libmp4v2.dll
00F00000 0003D000 00F3B640 in_mpc in_mpc.dll
00F40000 0003E000 00F5ED76 in_vorbi in_vorbis.dll
00F80000 00007000 00F814FC in_wave in_wave.dll
00F90000 0003D000 00FBAA8F libsndfi libsndfile.dll
----// SNIP SNIP //-------------------------------------------------
以下情况可导致EIP重新定向:
(DATA部分可写)
----// SNIP SNIP //-------------------------------------------------
...
.data:00472F14 ; sub_456A06+Bo ...
.data:00472F18 ; __int32 off_472F18
.data:00472F18 off_472F18 dd offset sub_456566 ; DATA XREF: sub_40340C+58r
.data:00472F18 ; sub_4543E8+59r ...
.data:00472F1C ; __int32 off_472F1C
.data:00472F1C off_472F1C dd offset sub_4565D5 ; DATA XREF: sub_406220+49r
.data:00472F1C ; sub_406587+BEr ...
.data:00472F20 ; __int32 off_472F20
.data:00472F20 off_472F20 dd offset sub_45668E ; DATA XREF: sub_4097F4+B1r
.data:00472F20 ; sub_45668E+Bo ...
...
----// SNIP SNIP //-------------------------------------------------
off_472F1C实际上为:
----// SNIP SNIP //-------------------------------------------------
00472F1C A0 AD 80 7C
----// SNIP SNIP //-------------------------------------------------
是指向KERNEL32.DLL!GetProcAddress API函数的指针。在这种情况下,可获得以下重新定向:
1) 7C80ADA0 -> 0080ADA0
2) 7C80ADA0 -> 7C00ADA0
3) 7C80ADA0 -> 7C8000A0
4) 7C80ADA0 -> 7C80AD00
也就是说当WINAMP.EXE试图调用GetProcAddress函数时就会跳到用户所修改的地址。
<*来源:Piotr Bania (bania.piotr@gmail.com)
链接:http://www.piotrbania.com/all/adv/nullsoft-winamp-libsndfile-adv.txt
*>
测试方法:
警  告
以下程序(方法)可能带有攻击性,仅供安全研究与教学之用。使用者风险自负!
建议:
厂商补丁:
Nullsoft
--------
目前厂商还没有提供补丁或者升级程序,我们建议使用此软件的用户随时关注厂商的主页以获取最新版本:
http://www.winamp.com/
浏览次数:2806
严重程度:0(网友投票)
绿盟科技给您安全的保障
