CVE:CVE-2006-7222
CNNVD:CNNVD-200708-442
"Media Player Classic（MPC）是匈牙利软件开发者Gabest所研发的一套开源的媒体播放器。该播放器能够播放VCD、SVCD及DVD等格式的文件。 
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地址，把这个地址改成能控制的地址就可以执行可控的代码。
"
solution:Upgrade guliverkli media_player_classic to a higher version than 6.4.9.0,and avoid the version 6.4.9.0