Nullsoft Winamp畸形ID3v2标签溢出漏洞

2008-04-09 04:18:22来源:互联网 阅读 ()

新老客户大回馈,云服务器低至5折

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/

标签:

版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有

上一篇:Sophos杀毒软件BZip2文档处理远程拒绝服务漏洞

下一篇:Microsoft Windows远程桌面协议(RDP)拒绝服务漏洞