Welcome to Team 509's Home
  

we think we do

  
Media Player Classic 的一个漏洞
Posted by wushi on Sunday, November 05 @ 02:38:01 CST
网络安全技术 Media Player Classic这个软件目前应用比较广。
这个问题在所有的版本中应该都存在的,目前最新的6.4.9.0也不例外。
这个问题会导致攻击者在受害人的机器上执行任何代码。

                                            Media Player Classic 的一个漏洞
                       
Media Player Classic这个软件目前应用比较广。
这个问题在所有的版本中应该都存在的,目前最新的6.4.9.0也不例外。
这个问题会导致攻击者在受害人的机器上执行任何代码。
下面言归正传,我们来看看这个漏洞到底是什么:
    问题出在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地址,把这个地址改成我们能控制的
地方就可以执行我们的代码了。我给出一个实例在http://www.team509.com/v02s41.fli ,
适用于win2k sp4 和 Media Player Classic 6.4.9.0(官方网站上的那个), 在这个文件中有四个字节要换成
你的IP地址(否则reverse shell不能回连),exploit成功的话,会生成port 4321的reverse shell的连接。
而且,我故意选择了一些地址与覆盖的vtable地址来保证它的不通用性,所以,除非你的机器跟我的差不多,否则
肯定没用,赫赫。如果你想写一个通用的exploit,你要扩大m_pFrameBuffer的长度,目前我采用的是8*8*4=256
byte长度,显然不够,最好是100*100*4 = 40000, 里面都填上shell code的地址和0x90,
这样就可以大大的增加成功的可能性,:),
当然,我中间的一些地址是选用了一些低端的地址,你需要选择一些高端地址和选择覆盖的vtable,对暴风影音编译
的那个你可以轻松的发现一个更好的,更有效的需要覆盖的函数地址,:).
当然,如果你愿意的话,也可以把这个当作标准heap overflow来做.

PS: 最近被一些公司搞得很不爽,漏洞报给他,要么告诉我,尽管很重要,但我们打算偷偷补掉,就不发安全通告了,
要么说我们打算下一个版本补掉,但时间嘛,未定,当然,我们也不打算出安全通告。搞得我报漏洞的积极性一点
都没有了。有人遇到这种情况么?一般怎么处理?

 
相关的链结
· 更多相关的 网络安全技术
· 新闻来源为 wushi


最受欢迎的报导,关於 网络安全技术:
MSN messenger 7.x (8.0?)VIDEO协议分析及一个remote heap overflow



文章评分
平均分数: 4.6
投票: 10


请花一秒钟给这篇文章一个分数:

完美
非常好
好
一般
差



选项

 友善列印格式 友善列印格式



相关主题

网络安全技术



花映垂杨汉水清,微风林里一枝轻。即今江北还如此,愁杀江南离别情。
PHP-Nuke Copyright © 2005 by Francisco Burzi. This is free software, and you may redistribute it under the GPL. PHP-Nuke comes with absolutely no warranty, for details, see the license.
本页产生时间: 0.04 秒