控制流程完整性:给大家介绍一种“另类”的Javascript反分析技术

写在前面的话

理解恶意软件的真实代码对恶意软件分析人员来说是非常有优势的,因为这样才能够真正了解恶意软件所要做的事情。但不幸的是,我们并不总是能够得到“真实”的代码,有时恶意软件分析人员可能需要类似反汇编工具或调试器之类的东西才能“推测”出恶意软件的真实行为。不过,当恶意软件使用的是“解释型语言”开发的话,例如Java、JavaScript、VBS或.NET等等,我们就有很多种方法来查看它们真正的原始代码了。

不幸的是,攻击者同样知道这些分析技术,而且为了规避安全分析,他们还会采用很多混淆技术来干扰研究人员的分析过程。攻击者可以利用反分析技术来判断恶意代码是否在虚拟机环境中运行,或者让自己的代码只在特定环境中运行以避免调试以及逆向分析环境(包括反混淆),而今天我们要讨论了就是一种基于JavaScript的新型反逆向分析技术。

JavaScript正邪对垒

对于攻击者来说,JavaScript已经变成一种非常重要的攻击向量了。它一般用于攻击的Payload感染阶段,它的使用非常多样化,编码形式也不像其他语言那样受到各种限制,而且几乎所有的恶意JavaScript代码都会进行混淆处理。下图显示的是一个经过了混淆处理的JavaScriptPayload样本:

对于恶意软件分析人员来说,第一步就是要对这种代码进行反混淆处理。从最简单的复制粘贴,到更强大一点的“脚本替换”(涉及函数和变量的重命名),研究人员需要想方设法让代码更加清晰。但是在JavaScript中,我们可以根据函数名的调用情况来了解函数的运行机制。比如说函数arguments.callee.caller(),在这个函数的帮助下,我们可以创建一个堆栈跟踪,并将执行过的函数按照顺序存储在列表中。获取到函数名之后,我们就可以将它们当作密钥来对处理过的JavaScript代码进行动态“解密”了。这项技术可以让我们得到隐式的控制流完整性,因为如果一个函数被重命名或者函数运行顺序发生了变化,那么“结果哈希”肯定是不同的。如果哈希不同,生成的密钥也就不同,这样就可以进行解密并运行经过特殊加密的代码了。

为了让大家更清楚地了解我在说什么,请大家看看下面这段没有经过混淆处理的样本代码【查看原始代码】:

代码运行过程中会对“特定内容”进行计算(eval()函数),在代码的第21和25行,函数cow001()和pyth001()会计算XOR后的解密内容。xor_decrypt函数可以接收两个参数:decoding_key和需要解密的Payload。接下来,代码会使用arguments.callee.name()函数来将内部阶段的每一个函数名当作解密密钥来使用,如果函数名是“原始函数名”(攻击者用来解密Payload的函数名),那么加密后的代码就会正常运行,不会报错。换句话说,如果函数名经过了重命名,那么eval()函数将得到错误的结果,并导致攻击者转换代码运行路径(使用简单的try catch语句)。

在使用JavaScript代码实施攻击之前,攻击者需要开发恶意JavaScript代码并对其进行混淆处理,这样才能准备好所谓的“攻击路径”。代码混淆的过程中,攻击者需要使用额外的脚本(比如说下面这段代码-【查看原始代码】)并根据混淆后的函数名来加密Payload,然后用新加密的Payload替换之前的代码(加密后的Payload就是加密函数名所使用的密钥)。

总结

现在,攻击者就可以使用自己设计的控制流来编写JavaScript代码了。如果攻击者不停地迭代实现这种技术,他基本上就可以完全规避逆向工程分析技术了。

希望本文的内容可以给大家的安全研究带来灵感!

原文发布于微信公众号 - FreeBuf(freebuf)

原文发表时间:2018-03-21

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏CDA数据分析师

三行Python代码,让数据预处理速度提高2到6倍

Python 是机器学习领域内的首选编程语言,它易于使用,也有很多出色的库来帮助你更快处理数据。但当我们面临大量数据时,一些问题就会显现……

20740
来自专栏liuchengxu

代码健康: 减少嵌套, 降低复杂性

原文: Code Health: Reduce Nesting, Reduce Complexity

11920
来自专栏小樱的经验随笔

BugkuCTF 计算器

前言 写了这么久的web题,算是把它基础部分都刷完了一遍,以下的几天将持续更新BugkuCTF WEB部分的题解,为了不影响阅读,所以每道题的题解都以单独一篇文...

280100
来自专栏点滴积累

geotrellis使用(十)缓冲区分析以及多种类型要素栅格化

目录 前言 缓冲区分析 多种类型要素栅格化 总结 参考链接 一、前言        上两篇文章介绍了如何使用Geotrellis进行矢量数据栅格化以及栅格渲染,...

37980
来自专栏ImportSource

设计模式-搞个接口,留有余地,让你我不再尴尬

设计模式,Design Patterns,Pattern,翻译为“模式”总感觉不够接地气,用今天的话来说可以叫“套路”。设计模式就是写代码的过程中一些常规打法和...

377120
来自专栏牛客网

阿里技术一面,Java研发岗

之前过了个简单的简历面,过了几天后没打来以为凉了,然后昨晚又接到了电话,括号内容是回答说的,理解有限,不一定都对,欢迎纠正~加油每一个牛友们! 阿里一面: ...

47090
来自专栏小樱的经验随笔

CTF---密码学入门第一题 这里没有key

这里没有key分值:10 来源: 西普学院 难度:易 参与人数:5577人 Get Flag:1965人 答题人数:2074人 解题通过率:95% 你说没有就没...

419110
来自专栏用户2442861的专栏

2014 360校园招聘技术类笔试题

原文:http://blog.csdn.net/lanxuezaipiao/article/details/41892553

17110
来自专栏Pythonista

Python之路,Day1 - Python基础1

python的创始人为吉多·范罗苏姆(Guido van Rossum)。1989年的圣诞节期间,吉多·范罗苏姆为了在阿姆斯特丹打发时间,决心开发一个新的脚本解...

18220
来自专栏编程

Sprint测试交付物设计

交付物定义: 基于敏捷开发流程,每个Sprint周期交付内容应如下: Burndown Chat(燃尽图),例如下图所示: ? Smock Test(冒烟测试)...

22360

扫码关注云+社区

领取腾讯云代金券