前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Swf Decrypt详解

Swf Decrypt详解

作者头像
FB客服
发布2018-02-06 14:23:56
2.1K0
发布2018-02-06 14:23:56
举报
文章被收录于专栏:FreeBufFreeBuf

攻击在持续,攻击的技术在演进。防御者需要持续的跟进研究和投入。最近Flash 0day频繁出现,将我们更多的目光集中到flash上。

Flash作为脚本语言,可以编译,不少的恶意flash文件通过各种加密、混淆、动态解密来对抗人工分析和引擎检测。通过动态执行,常见的动态解密的swf都可以解决。

不过遇到很多条件判断、环境依赖的限制,往往又无法稳定dump出解密的swf文件和关键的数据(shellcode)。如果能在静态的方法对混淆、加密的swf文件直接进行反混淆、反编译,则将能有效提升检测效果。

市面上可以对swf进行加密的软件很多,如swfencrypt、doswf、secureswf、dcomsoft等,我们这次对doswf以及secureswf进行简单的分析,与各位小伙伴分享。

恶意的SWF常常通过doswf加密和secure swf混淆,真正利用的部分被加密、混淆,通过研究doswf的加密方式以及secureswf的混淆方式,可以直接通过静态的方法进行相应的解密和反混淆,直接检测最核心的恶意代码部分,有效提升引擎检测率。(用户可使用文件B超系统 http://b-chao.com 和云盾-星云APT检测产品享受到我们的技术成果)

doswf

doswf是国人开发的一款flash加密混淆软件,从官网可以看出该软件已经停止了开发,当前最新版本为5.4.3。

我们对比了版本4.9.7和最新版本之间加密效果的区别,发现两者相差不大,在介绍完整体的加密流程之后,再将它们之间的差异展示出来。

Crypt Flow

经过doswf加密的swf文件,都存在DefineBinaryData的tag,因为原始swf文件将会存放在这个二进制数据中,二进制数据经过解密后通过loadbytes进行加载。

这个二进制数据的头部结构如下(B标示字节):

原始swf文件从起始以offset为步长,每次对block_sz的块进行处理,块中的数据并不是逐一字节处理的,而是依据一个特定值跳跃处理,在整个文件处理完成后进行压缩,压缩后的数据再加上上面的头部信息就形成了完整的二进制数据了。

上面的描述简化了一些不重要的因素,如doswf加密时还会嵌入两个额外的swf文件,所以当解密二进制数据后,会发现解密后的数据中包含三个swf,这时只要根据硬编码特征”FWS”、”CWS”就可以将所有包含的swf文件完整dump出来。

关键解密代码:

版本4.9.7和最新版本解密代码的差异:

可以看到,差异在于头字节结构的几个值得获取、大小端以及跳跃值的不同。

我们拿CVE-2012-0779样本(md5:2b98d285c8b581855d59ac368956ee78)进行测试,这是一个doswf4.9.7版本加壳的样本:

检测dump出的数据,可以发现里面包含有三个swf文件。

Decrypt Code

目前放出针对旧版的解密代码(新版自行解决,根据前面的提示很容易更改),仅支持解压后的doswf解密

测试的样本由MD5: 2b98d285c8b581855d59ac368956ee78 解压之后的样本。

SecureSwf

Secureswf加密软件,号称break掉所有的flash反编译软件,支持对资源加密、 支持对as code级别做混淆,通过添加各种jump 、反复跳转指令、垃圾指令填充 阻止反编译软件反编译 增加分析人员分析出具体的actionscript原理难度。

之前拿到CVE-2015-3105 样本就是用secure swf混淆过的,刚好可以分析下

MD5: 58d1022923950ad1452c72f46b1ee3d0。

DUS function

以这个dus函数为例做反混淆:

Type1 jump

getlocal_0

pushscope

pushbyte 0

newfunction 30

pop

jump ofs0017

convert_i

declocal 4

urshift

rshift

declocal_i 2

declocal 2

astypelate

newactivation

increment

ofs0017:getlocal 4

jump之间都是垃圾指令 可以直接改成

getlocal_0

pushscope

pushbyte 0

newfunction 30

pop

getlocal 4

把这段abccode中所有jump之间的直接去掉。

Type2 getlocal n

混淆指令里面充斥着getlocal n指令 获取寄存器的value 并PUSH STACK,紧接着跟着判断,如:

getlocal 4 // reg4.value push stack

iffalse ofs0013 // pop reg4.value judge this value if is false

pushbyte 0

newfunction 30

pop

getlocal 4

iffalse ofs0013

increment_i

increment_i

pushbyte 7

multiply_i

decrement_i

ofs0013:setlocal_3

local4 初始化值应该为0 ,则可以直接简化成

pushbyte 0

newfunction 30

pop

setlocal_3

后面以此类似:

getlocal 5

iftrue ofs0053

local5 为0,则不会跳转,直接简化这两条指令。

所以没有经过setlocal n的n对应的getlocal n获取的值应该都是0,带着这样的设定来精简指令就很容易了。

getlocal 13

not

iffalse ofs00d9 //条件不成立 直接去掉这样的三条指令

getlocal 13

iftrue ofs00ed //条件不成立 直接去掉这样的2条指令

getlocal 12

iffalse ofs0159//条件成立 直接去掉当前2条指令到ofs0159 直接的所有指令(中间代码没有其他地方跳转过来)

Type3 garbage ins

getlocal_1

pushbyte 4

modulo

iffalse ofs0053

ofs0053:

local1 为0,modulo之后 0/4 为0 ,push stack,iffalse pop stack,条件成立,无意义片段。

还有一些:

decrement_i

increment_i

decrypt dus function

Rxgpittdkc function

在以这个函数为例,按照上面的步骤,先去除jump 垃圾指令,在去除getloca n之类的垃圾指令:

Dphgjxukp function

Type4 kill ins

getlocal_1 // reg1.value push stack

getlocal_0 // reg0.value push stack

getlocal_2 // reg2.value push stack

kill 1 //kill reg1.value

kill 0 //kill reg0.value

kill 2 //kill reg2.value

setlocal_2 //pop stack,set value to reg2.value

setlocal_0 //pop stack,set value to reg0.value

setlocal_1 //pop stack,set value to reg1.value

这样的指令集也是垃圾指令。

Type5 as function flow change

Secure Swf会对简单的as 函数调用从abc 层面流程进行混乱。比如这个dphgjxukp 函数 还原之后真正的代码如下:

niraodwx();

init();

return;

解混淆之后:

可以看到jpexs对这样的反编译是混乱的,可以把相应的跳转换成jump。比如getlocal_2 iffalse 换成jump ofs0044 ,以此类似,最终得到的反编译结果。

可以看到这个swf混淆的还是很容易解密出来的,更多的人工体力活可以通过编写自动化的脚本来实现。(有钱的主可以购买avs actionscript view的149USD的插件 直接反编译secureswf)。

< 部分代码过长,被删节,请点击“阅读原文”查看 >

*作者:云柠(Joy) & 入侵(Instruder)@阿里基础安全威胁情报中心,转载须注明来自FreeBuf黑客与极客(FreeBuf.COM)

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2015-07-03,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 FreeBuf 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
高级威胁追溯系统
腾讯高级威胁追溯系统(Advanced Threat Tracking System,ATTS)由腾讯安全团队构建的高级威胁追溯平台,旨在帮助用户通过该平台进行线索研判,攻击定性和关联分析,追溯威胁源头,有效预测威胁的发生并及时预警。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档