Top
首页 > 老文章 > 正文

Media Player Classic存缓冲区溢出漏洞

Media Player Classic漏洞

Media Player Classic处理fli文件时存在缓冲区溢出漏洞,远程攻击者可能利用此漏洞控制客户端。
发布时间:2007-09-04 07:02        来源:        作者:绿盟科技
【绿盟科技授权,赛迪发布,谢绝任何网站转载,违者,赛迪网将保留追究其法律责任的权利!】 发布日期: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/(责任编辑:李磊)
加载更多

专题访谈

合作站点
stat