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