安全研究
安全漏洞
Media Player Classic FLI文件处理远程缓冲区溢出漏洞
发布日期:2007-08-25
更新日期:2007-08-27
受影响系统:
guliverkli Media Player Classic 6.4.9.0描述:
BUGTRAQ ID: 25437
Media Player Classic是一个免费的基于WMP的播放程序,支持几乎所有媒体格式。
Media Player Classic处理fli文件时存在缓冲区溢出漏洞,远程攻击者可能利用此漏洞控制客户端。
在FLICSource.cpp文件中的以下函数:
690 void CFLICStream::_deltachunk()
691 {
692 BYTE* tmp = m_pFrameBuffer; //m_pFrameBuffer 的长度为m_hdr.x*m_hdr.y*32>>3,
//注意m_hdr.x,m_hdr.y是从一个fli文件中读出的,是我们能控制的
693
694 WORD lines;
695 m_flic.Read(&lines, sizeof(lines)); //这里的lines是从一个fli文件中读出的
696
697 while(lines--)
698 {
699 signed short packets;
700 m_flic.Read(&packets, sizeof(packets)); // packets也是从一个fli文件中读出的
701
702 if(packets < 0)
703 {
704 if(packets&0x4000)
705 {
706 tmp += -packets * m_hdr.x;
707 lines++;
708 }
709 else
710 {
711 signed char count;
712 m_flic.Read(&count, sizeof(count));
713 tmp[m_hdr.x-1] = (BYTE)packets;
714 }
715 }
716 else
717 {
718 BYTE* ptr = tmp;
719
720 while(packets--)
721 {
722 BYTE skip;
723 m_flic.Read(&skip, sizeof(skip));
724
725 ptr += skip; //这里可以使指针快速移动
726
727 signed char count;
728 m_flic.Read(&count, sizeof(count)); // count也是从一个fli文件中读出的
729
730 if(count >= 0)
731 {
732 m_flic.Read(ptr, count << 1); //把fli文件中的内容copy到ptr指向的内存中
733 ptr += count << 1;
734 }
735 else
736 {
737 WORD c;
738 m_flic.Read(&c, sizeof(c));
739 count = -count;
740 while(count-- > 0)
741 {
742 *ptr++ = c>>8;
743 *ptr++ = c&0xff;
744 }
745 }
746 }
747
748 tmp += m_hdr.x;
749 }
750 }
751 }
ptr在这个操作中没有设定边界,允许覆盖m_pFrameBuffer后面的内容,而且这些内容可以有选择地覆盖(725行),后面有些地址是new出来的对象的地址。攻击者可以选择覆盖一个对象的vtable地址,把这个地址改成能控制的地址就可以执行可控的代码。
<*来源:wushi (wooshi@gmail.com)
链接:http://secunia.com/advisories/26591/
http://www.team509.com/modules.php?name=News&file=article&sid=38
*>
测试方法:
警 告
以下程序(方法)可能带有攻击性,仅供安全研究与教学之用。使用者风险自负!
建议:
厂商补丁:
guliverkli
----------
目前厂商还没有提供补丁或者升级程序,我们建议使用此软件的用户随时关注厂商的主页以获取最新版本:
http://guliverkli.sourceforge.net/
浏览次数:2881
严重程度:0(网友投票)
绿盟科技给您安全的保障