手机站
网通分站
电信主站
密 码:
用户名:
当前位置 : 主页>服务器技术>安全防护>列表

Nullsoft Winamp畸形ID3v2标签溢出漏洞

来源:互联网 作者:西部数码 时间:2008-04-09
西部数码-全国虚拟主机10强!40余项虚拟主机管理功能,全国领先!双线多线虚拟主机南北访问畅通无阻!免费赠送企业邮局,.CN域名,自助建站480元起,免费试用7天,满意再付款! P4主机租用799元/月.月付免压金!
Nullsoft Winamp畸形ID3v2标签溢出漏洞

发布日期:2005-07-18
更新日期:2005-07-18

受影响系统:
Nullsoft Winamp 5.091
Nullsoft Winamp 5.09
Nullsoft Winamp 5.03a
描述:
BUGTRAQ ID: 14276

Winamp是Nullsoft发布的免费音频播放器,支持多种格式。

Winamp在处理MP3文件的ID3v2标签时存在缓冲区溢出,攻击者可能利用此漏洞在用户机器上执行任意指令。

在播放完mp3文件时,Winamp会更新播放列表。如果ID3v2标签(比如ARTIST或TITLE)的某些部分超长的话,就可能溢出strcpy()函数中今后用作源址的值。strcpy()调用可以覆盖DATA段中的值,而该值之后在jump指令中会将代码执行指向攻击者所提供的缓冲区。

如果要溢出DATA段中的重要值,攻击者必须首先绕过安全检查。在下面的asm代码中,攻击者可以控制EAX寄存器,然后从函数返回后该EAX就可用作strcpy()的源址。

这段安全检查代码会测试内存中EAX地址的0x9B4偏移处是否存在0x00000001 (ECX)这个值。如果存在这个值的话,则从函数返回后相同的EAX内容就会用作strcpy()中的源址,否则EAX就会设置为位于当前EAX寄存器地址0x9B8偏移处的值,程序会跳至循环的开始。

--------------------------------------------------------
004371FA /$ 8B4424 04 MOV EAX,DWORD PTR SS:[ESP 4]
004371FE |> 85C0 /TEST EAX,EAX
00437200 |. 74 14 |JE SHORT Winamp.00437216
00437202 |. 8B88 B4090000 |MOV ECX,DWORD PTR DS:[EAX 9B4]
00437208 |. 3B4C24 08 |CMP ECX,DWORD PTR SS:[ESP 8]
0043720C |. 74 0D |JE SHORT Winamp.0043721B
0043720E |. 8B80 B8090000 |MOV EAX,DWORD PTR DS:[EAX 9B8]
00437214 |.^EB E8 \JMP SHORT Winamp.004371FE
00437216 |> B8 DC124600 MOV EAX,Winamp.004612DC ; ASCII "No Entry"
0043721B \> C3 RETN
--------------------------------------------------------

以下是反汇编的asm代码:

--------------------------------------------------------
char *check (char *arg, int val) // val = 0x00000001
{
while (arg != NULL)
{
if (*((int*)&arg[2484]) == val) // 0x9b4 = dec. 2484
return arg;
else arg = (char*)*((long*)&arg[2488]); // 0x9b8 = dec. 2488
}
arg = "No Entry";
return arg;
}
--------------------------------------------------------

如果要绕过检查,必须将EAX (arg)设置为地址EAX 9B4值为0x00000001 (val)的字符串缓冲区地址,该字符串必须足够长,能够覆盖跳转地址。字符串至少应为284字节才能溢出到DATA段中的跳转地址。ID3v2数据位于DATA段中,其中有很多0x00000001值,因此可以确定一些Winamp和Windows版本的静态地址。

如果没有满足EAX 9B4=0x00000001这个条件,就会将EAX设置为EAX 9B8地址的值,然后重新测试,因此攻击者甚至可以创建用于在内存中扫描0x00000001的暴力猜测缓冲区。但这仅是理论上的可能性。

如果绕过了安全检查的话,就会执行strcpy(),覆盖跳转地址。strcpy()代码如下:

--------------------------------------------------------
00438D59 |. 50 PUSH EAX ; /src = "FFFFFFFFFFFFFFFFFFFF..."
00438D5A |. FF75 08 PUSH DWORD PTR SS:[EBP 8] ; |dest
00438D5D |. E8 60D20100 CALL <JMP.&MSVCRT.strcpy> ; \strcpy
--------------------------------------------------------

strcpy()的目标地址为距离跳转地址280个字节。必须覆盖这个地址才能重新定向代码执行。在本文的具体例子中,该地址为0x00470D40。

执行完这些后,下一段代码会从地址0x00470E58执行代码。

--------------------------------------------------------
0041D440 /$ A1 580E4700 MOV EAX,DWORD PTR DS:[470E58]
0041D445 |. 85C0 TEST EAX,EAX
0041D447 |. 74 03 JE SHORT winamp.0041D44C
0041D449 |. FF60 48 JMP DWORD PTR DS:[EAX 48] <- 0wnZ Winamp
0041D44C \> C3 RETN
--------------------------------------------------------

<*来源:Leon Juranic (ljuranic@LSS.hr)

链接:http://marc.theaimsgroup.com/?l=bugtraq&m=112145150924776&w=2
*>

测试方法:

警 告

以下程序(方法)可能带有攻击性,仅供安全研究与教学之用。使用者风险自负!

http://security.lss.hr/PoC/demo.mp3

建议:
厂商补丁:

Nullsoft
--------
目前厂商已经发布了升级补丁以修复这个安全问题,请到厂商的主页下载:

http://www.winamp.com/

文章整理:西部数码--专业提供域名注册虚拟主机服务
http://www.west263.com
以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!