加载中…
个人资料
  • 博客等级:
  • 博客积分:
  • 博客访问:
  • 关注人气:
  • 获赠金笔:0支
  • 赠出金笔:0支
  • 荣誉徽章:
正文 字体大小:

微软工程师犯“程序员的错误” 爆发MPEG-2零日攻击

(2009-07-07 16:54:57)
标签:

零日攻击

mpeg-2

趋势科技

视频

挂马

it

分类: 安全信息

MS08-067带来的Worm_downad的硝烟还没有完全散去,最近又惊爆一个新的0 Day漏洞,喜欢上网看图片和视频的网民们要小心了,说不你正看得眼冒金星的时候,病毒已经在悄悄地侵入你的电脑。

 

这个漏洞发生在windows系统的BDATuningModelMPEG2TuneRequest视频组件中。当用户浏览被挂马的网页时,恶意代码就会调用MPEG2视频组件的msvidctl.dll模块,从而溢出执行ShellCode。

 

说起来有意思的是,这个漏洞归根到底是由于微软工程师犯了一个“程序员的错误”。本来是应该传递一块buffer的指针过去,但是结果却传递了这个指针的指针,也就是MOV变成了LEA。这个大部分程序员都曾犯过的错误就这样成了本次0Day的罪魁祸首。

 

0 day漏洞的模块调用顺序如下:

msvidctl.dll的ATL::AtlIPersistStreamInit_Load调用 ATL::CComVariant::ReadFromStream,后者再调用mshtml!FatStream::Read。

 

ATL::CComVariant::ReadFromStream申请内存后,在调用mshtml!FatStream::Read时,将保存buffer指针的堆栈地址(也就是说,这个堆栈地址上存放的是buffer的指针的地址)当成了buffer的指针,即Read(buff)变成了Read(&buff),使得读入的数据覆盖掉了ATL::AtlIPersistStreamInit_Load的局部变量还有函数内的SHE。如果黑客精心构造了这部分数据,就有可能执行ShellCode。

 

让我们看下挂马的脚本:

微软工程师犯“程序员的错误” <wbr>爆发MPEG-2零日攻击

代码分两部分,第一部分为Heap Spray,第二部分是造成溢出的代码。

先看看第二部分代码,很简单,只有5行:

var myObject=document.createElement('object');

DivID.appendChild(myObject);

myObject.width='1';

myObject.height='1';

myObject.data='./logo.gif';


这部分代码创建一个MPEG-2对象,并载入logo.gif。

Logo.gif的数据如下:

00000000   00 03 00 00 11 20 34 00  00 00 00 00 00 00 00 00   ..... 4.........
00000010   00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00   ................
00000020   00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00   ................
00000030   00 00 00 00 00 00 FF FF  FF FF 0C 0C 0C 0C 00      ......ÿÿÿÿ.....

 

第14个字节开始的这部分数据被读入栈中后,造成缓冲区溢出覆盖掉SEH,使shellcode获得执行机会。

 

再来看看第一部分代码:

由于js的内存申请从低地址0x00000000向高地址分配,所以代码里申请了300块一样的内存,这样做的目的是来用来保证地址0x0C0C0C0C在我们申请的内存范围内。这300块一样的内存中,前一部分是NOP,后面是ShellCode代码。所以,只要程序能跳转到0x0c0c0c0c地址,执行完大量的NOP指令后,最终将执行ShellCode。

 

这时对比看下,我们就知道logo.gif中14字节后的0xFFFFFFFF与0x0C0C0C0C的作用了。精心构造的logo.gif中的 0xFFFFFFFF与0x0C0C0C0C刚好覆盖掉ATL::AtlIPersistStreamInit_Load的SEH,结果ATL::AtlIPersistStreamInit_Load在后续操作中触发了异常,就跳到 0x0c0c0c0c,也就是ShellCode所在的区域中执行了。

 

通常ShellCode都会去恶意URL下载新的病毒下来,这是你的机器就保不住啦。

 

预防方法:

细心的朋友肯定猜到了,由于溢出的数据是由MPEG-2这个Object调用的,所以我们能不能不让浏览器创建这个对象?可以,只要我们在注册表中删掉0955AC62-BF2E-4CBA-A2B9-A63F772D46CF这个class id就可以啦。

 

所以在微软的补丁还没发布前,你可以通过这个方法来避免中招。

当然如果你安装了趋势的产品,并且保持更新,也可以阻挡恶意链接的侵犯。

 

0

阅读 收藏 喜欢 打印举报/Report
  

新浪BLOG意见反馈留言板 欢迎批评指正

新浪简介 | About Sina | 广告服务 | 联系我们 | 招聘信息 | 网站律师 | SINA English | 产品答疑

新浪公司 版权所有