欢迎来到 嗅灵易学

零基础也能上手的脚本技术课,一对一答疑带你入门

MPEG-2 0day漏洞:缓冲区溢出覆盖SEH

MPEG-2 0day漏洞:缓冲区溢出覆盖SEH

作者blog:http://hi.baidu.com/yicong2007
目   的:纯属学习,请勿用于恶意用途。
系统环境:XP SP3 简体中文版,IE 7
工   具:WinDbg+IDA
感谢mj0011指正了我原先分析的错误,感谢云砉生指出了出现漏洞的实质原因。
MPEG-2 0day是一个ReadFile时的缓冲区溢出,通过覆盖SEH配合heap spray使得shellcode获得执行机会。
漏洞利用网页http://vip762.3322.org/aa/index.htm
相关畸形文件logo.gif内容:
Offset      0  1  2  3  4  5  6  7   8  9  A  B  C  D  E  F
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      ...........
因为我不清楚这个编码规范,仅凭后面调试过程中看到的结果,猜测这个结构。
第0-3个字节 0x00000300h,某个属性标识,意义不详
第4-5个字节 0x2011h,这似乎又是一个属性值(代码中根据这个属性值不同去到不同的分支)
第6-9个字节 0x00000034h, 这个似乎指的是该DWORD后面的内容的长度。
第10-13个字节 与第6-9个字节一起被读入,用途不详。
第14个字节及以后:由于代码对缓冲区地址以及指针的处理有误,这部分数据被读入栈中,造成缓冲区溢出覆盖掉SEH,使shellcode获得执行机会。
触发过程:
在msvidctl.dll的ATL::AtlIPersistStreamInit_Load调用ATL::CComVariant::ReadFromStream的时候,后者通过读取文件中的这个标识内容长度的0x00000034h,并调用mshtml!FatStream::Read(是对ReadFile的封装)将内容读入内存。
ATL::CComVariant::ReadFromStream成功申请了内存,但是在调用mshtml!FatStream::Read的时候犯了一个程序员经常犯的错误(感谢云砉生指出这一点),即将保存缓冲区指针的堆栈地址当成缓冲区指针本身传入(将传入参数buff误写为&buff),使得读入的文件内容覆盖掉了属于ATL::AtlIPersistStreamInit_Load的局部变量以及其设置的SEH,其中0xFFFFFFFF与0x0C0C0C0C刚好覆盖掉SEH,0x0C0C0C0C这个地址已通过Heap spray被shellcode前面的nop占据,结果ATL::AtlIPersistStreamInit_Load在后续操作中触发了异常,就跳到shellcode中执行了。

ATL::AtlIPersistStreamInit_Load的代码如下,注意注释的标号说明顺序。

注意:上传附件及图片大小不得大于30M。

⚠️ 版权声明:
本博客所有内容(含教程、源码、工具)仅供个人技术学习与研究交流使用,严禁商用、倒卖、二次分发及非法用途。
未经作者书面授权,任何组织或个人不得转载、复制或用于其他平台,违者将追究相关责任。

0 0 0 举报
复制成功