"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)); //...
"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地址,把这个地址改成能控制的地址就可以执行可控的代码。 "