写在前边
混淆一词是指掩盖有意义信息的过程。恶意软件作者经常使用各种混淆技术来隐藏信息,并修改恶意内容,使安全分析人员难以发现和分析。他们通常会使用编码/加密技术来掩盖安全产品的信息,除此之外,攻击者还会使用打包器等程序来混淆恶意二进制内容,这使得分析和逆向工程更加困难。
在本系列文章中,我们将研究如何识别这些混淆技术,以及如何解码/解密和解压恶意二进制文件。我们将首先简单了解一下编码/加密技术,再了解一下解包技术。
攻击者通常会出于以下原因使用编码和加密:
1.掩盖命令和控制通信。
2.隐藏基于签名的解决方案,如入侵防御系统、隐藏恶意软件所使用的配置文件的内容。
3.加密从受害者系统中传出的信息。
4.混淆恶意二进制文件中的字符串,以躲避静态分析。
在我们深入研究恶意软件如何使用加密算法之前,让我们简单了解一些即将会常使用的基本知识和一些术语。
明文:
指未加密的信息;这可能是命令和控制(C2)流量或恶意软件想要加密的文件内容。
加密文本:
指加密信息;这可能是恶意软件从C2服务器收到的加密的可执行文件或加密命令。
恶意软件对明文进行加密,将明文与密钥一起作为输入传递给加密函数,从而产生一个密码文本。由此产生的密码文本通常被恶意软件用来写入文件或通过网络发送。
以同样的方式,恶意软件可以从C2服务器或文件中接收加密的内容,然后通过将加密的内容和密钥传递给解密功能来解密,如下图所示。
在分析恶意软件时,我们可能想了解某个特定内容是如何被加密或解密的。要做到这一点,我们将主要关注识别加密或解密功能以及用于加密或解密内容的密钥。
例如,如果你想确定网络内容是如何被加密的,那么你可能会在网络输出操作(如HttpSendRequest())之前找到加密函数。同样地,如果你想知道C2的加密内容是如何被解密的,那么你很可能在使用诸如InternetReadFile()这样的API从C2检索到内容后找到解密函数。
一旦确定了加密/解密功能,检查这些功能将会使你了解到内容是如何加密/解密的、使用的密钥,以及用于混淆数据的算法。
一
简单编码
大多数时候,攻击者会使用非常简单的编码算法,如Base64编码或xor加密来掩盖数据。攻击者之所以使用简单的算法,是因为它们容易实现,占用较少的系统资源,而且刚好可以掩盖安全产品及安全分析人员分析的内容。
01
凯撒密码
凯撒密码,也被称为移位密码,是一种传统的密码,是最简单的编码技术之一。它通过将明文中的每个字母在字母表中下移一些固定的位置来对信息进行编码。例如,如果你将字符 “A “向下移动3个位置,那么你将得到 “D”,而 “B “将是 “E”,以此类推,当移动到 “X “时,将包裹回 “A”。
1.1 凯撒密码的工作原理
理解凯撒密码的最好方法是写下从A到Z的字母,并给这些字母分配一个索引,从0到25,如下图所示。换句话说,’A’对应于索引0,’B’对应于索引1,以此类推。一组从A到Z的所有字母被称为字符集。
现在,让我们假设你想把字母转移三个位置,那么3就成了你的密钥。为了加密字母’A’,将字母A的索引(即0)加到钥匙3上;这样的结果是0+3=3。现在用结果3作为索引,找到相应的字母,也就是’D’,这样’A’就被加密成’D’了。同理,为了加密’B’,我们将把’B’的索引(1)加到钥匙3上,结果是4,索引4与’E’有关,所以’B’加密为’E’,以此类推。
这种技术的问题出现在我们到达’X’的时候,它的索引是23。当我们将23+3相加时,我们得到26,但我们知道没有与索引26相关的字符,因为最大索引值是25。我们还知道,索引26应该绕回索引0(与’A’相关)。
为了解决这个问题,我们用字符集的长度进行模数运算。在这种情况下,字符集ABCDEFGHIJKLMNOPQRSTUVWXYZ的长度是26。现在,为了加密’X’,我们使用’X’的索引(23)并将其添加到密钥(3)中,然后对字符集的长度(26)进行模数运算(也就是26=0(mod26)),如下所示。
(23+3)%26 = 0
这个操作的结果是0,它被用作索引来寻找相应的字符,也就是’A’。
模数操作允许你循环回到开头。你可以用同样的逻辑来加密字符集中的所有字符(从A到Z),并绕回起点。在凯撒密码中,你可以用以下方法获得被加密(密文)字符的索引。
(i + key) % (length of the character set 字符串长度)
where i = index of plaintext character 明文字符串索引
*左右滑动查看更多
以同样的方式,我们可以用以下方式获得明文(解密)字符的索引。
(j - key) % (length of the character set)
where j = index of ciphertext character
*左右滑动查看更多
下图显示了字符集、加密和以3为密钥的文本 “ZEUS “的解密(移动三个位置)。加密后,文本 “ZEUS “被翻译成 “CHXV”,然后解密又将其翻译成 “ZEUS”。
1.2 用Python解密凯撒密码
下面是一个简单的Python脚本的例子,它将字符串 “CHXV “解密为 “ZEUS”。
"ABCDEFGHIJKLMNOPQRSTUVWXYZ" >>> key = 3 > chr_set =
"CHXV" > cipher_text =
"" > plain_text =
cipher_text: > for ch in
j = chr_set.find(ch.upper())
plain_index = (j-key) % len(chr_set)
plain_text += chr_set[plain_index] print plain_text
ZEUS
*左右滑动查看更多
一些恶意软件样本可能使用凯撒(shift)密码的修改版本,在这种情况下,你可以修改前面提到的脚本以满足你的需求。
APT1集团使用的恶意软件WEBC2-GREENCAT从C2服务器获取内容,并使用修改版的凯撒密码对内容进行解密。它使用了一个66个字符的字符集”abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ01 23456789._/-“,和一个56的密钥。
(未完待续)
— 往期回顾 —
原文始发于微信公众号(安恒信息安全服务):九维团队-青队(处置)| 恶意软件的混淆技术(一)