CVE-2011-0611 分析
CVE-2011-0611 分析
参考文献:
http://secunia.com/blog/210/
写的理由:
回过头来看,Secunia的文章对该样本的分析已经非常详尽了,但是,在最初拿到样本,对照文章逐步对其进行解剖时,总是会许多无从下手的问题。
所以,就有了写这篇分析的想法,一方面是锻炼英文,一方面是因为“Happiness is only real when shared“,希望大牛们对文章中的错误
作出指正。好了,言归正传,下面就开始进入正题吧。
漏洞概述:
此处不再赘述。
分析正文:
Secunia的样本是一个嵌入了Flash的Word文档,文档名为"Disentangling Industrial Policy and Competition Policy.doc",可以在文章附件获取到
,嵌入的Flash偏移地址是0x2E08,流大小为0x2775字节。我们分析的样本是Metasploit中的CVE-2011-0611.swf,大小为1484字节,文件不同,原理一
致。

图片 Head.jpg
在对SWF格式零知识的情况下,用Flasm对样本进行反编译,命令行为 flasm -d CVE-2011-0611.swf > Now.txt,提示解码错误。

图片 DecodeErrorOne.JPG
错误信息为常量池(constant pool)长度错误,与Secunia文章中提到的第一个错误一致。
************************************************************************************************************************************
ActionRecode格式为:
值域 类型 描述
ActionCode UI8 Action类型
Length 如果Code大于0x80,长度为UI16 ActionCode后面数据的字节数
常量池的格式为:
值域 类型 描述
ActionConstantPool UI8 0x88
Count UI16 常量个数
ConstantPool STRING[Count] 字符串常量
说明:在每个Action Block首部,如果有任何变量,方法或字符串使用了两次以上,那么Flash会建立一个常量池。实际上,只要有一个变量使用了一次以上,该代码块中的所有字符串都会加入该池。
************************************************************************************************************************************
错误的常量池改正后为:

图片 HeadCorrected.JPG
再次使用Flasm进行反编译,解码结果仍然提示 Disassembly may be incomplete:wrong action length encountered,即错误的Action长度。一个一个记录的检查肯定坑爹,使用010 Editor + SWF
Template进行格式检查,模板结果显示SWF解析至DoAction段就出现了错误。打开DoAction节点,错误发生在0x5B1处。

图片 TemplateResult.JPG

图片 ParseError.JPG
发生错误的记录类型为0x96,ActionPush
************************************************************************************************************************************
值域 类型 描述
ActionPush ActionRecord 0x96,ActionRecord的长度为值类型和值的字节数
Type UI8 0 = 以Null为终止符的字符串
1 = 32位小端浮点数
以下类型在SWF >= 5 版本有效
2 = null
3 = undefined
4 = register
5 = boolean
6 = 64位双精度小端double
7 = 32位小端integer
8 = constant 8
9 = constant 16
************************************************************************************************************************************
该ActionPush记录为 96 27 01 FB 68 DB 39 D5 54 73 34 0F 46 40 9E 66 12
首先记录长度错误,将 27 01 修改为 0E 00,然后修改一个字节的类型,将 FB 修改为 00 字符串类型。
再次使用Flasm进行反编译,结果提示表示一个Action中存在分支结构,这些分支结构即为Secunia提到的复杂混淆,下面的工作是消除这些混淆。反编
译结果中存在较多形同如下代码的无效指令:
push FALSE, 326943637, 326943739 //压入两个数
oldEquals //是否相等,显然不等
not //结果取反为真
branchIfTrue label44 //满足跳转
将所有的没有必要的前向跳转和后向跳转去掉,例如:
label2:
branch label8
label4:
... ...
label8:
push X_PROPERTY, UNDEF, X_PROPERTY, c:0
branch label4
可以简化为:
label2:
push X_PROPERTY, UNDEF, X_PROPERTY, c:0
... ...
去混淆结果“代码块一”为,已经将常量索引用具体字符串替代:
注意:上传附件及图片大小不得大于30M。
⚠️ 版权声明:
本博客所有内容(含教程、源码、工具)仅供个人技术学习与研究交流使用,严禁商用、倒卖、二次分发及非法用途。
未经作者书面授权,任何组织或个人不得转载、复制或用于其他平台,违者将追究相关责任。
