导语:许多恶意Word文档具有嵌入式可执行有效内容,这是基于base64编码的(或其他一些编码)。
介绍
分析恶意软件通常需要代码逆向能力。
可执行文件经常被编码以避免检测。例如,许多恶意Word文档具有嵌入式可执行有效内容,这是基于base64编码的(或其他一些编码)。为了理解编码,并且能够对有效载荷进行解码以进行进一步分析,经常执行宏代码的逆向。
但代码逆向并不是唯一可能的解决方案。这里我们将描述一种可以应用于某些恶意软件家族的统计分析方法,如Hancitor恶意文档。我们将逐步介绍这种方法。
例子
首先我们从BASE64编码的Windows可执行文件(PE文件)开始。在BASE64编码中,64个不同的字符用于编码字节。64是6位,因此在BASE64编码时有一个开销,因为编码一个字节(8位)将需要2个BASE64字符(6位+ 2位)。
使用byte-stats.py,我们可以为文件中找到的不同字节值生成统计信息。当我们使用它来分析我们的BASE64编码的可执行文件时,我们得到这个输出:
在上面的截图中,我们有64个不同的字节值,100%的字节值是BASE64字符。这是一个很强的指示,文件base64.txt中的数据确实是BASE64编码的。
使用byte-stats.py的选项-r,我们将介绍文件中找到的字节值的范围:
识别的范围/ 0123456789,ABCDEFGHIJKLMNOPQRSTUVWXYZ和abcdefghijklmnopqrstuvwxyz(和单个字符+)确认这确实是BASE64数据。填充的BASE64数据将在最后包括一个或两个填充字符(填充字符为=)。
使用base64dump.py(BASE64解码工具)解码此文件,确认它是BASE64编码的PE文件(cfr。MZ头)。
现在,有时编码比BASE64编码要复杂一些。
我们来看看另一个例子:
例如,小写字母的范围以d开头(代替a),以}结尾(而不是z)。我们观察到其他范围的类似变化。
看起来所有的BASE64字符都向右移动了3个位置。
我们可以通过从每个字节值减去3来测试这个假设(即向左移3个位置)并分析结果。要从每个字节减去3,我们使用程序translate.py。translate.py将文件作为输入和算术运算:操作“byte-3”将从每个字节值中减去3。
这是当我们对左移3个位置的字节值进行统计分析时得到的结果:
在上面的截图中,我们看到64个唯一字节,所有字节都是BASE64字符。当我们尝试用base64dump来解码它,我们确实可以恢复可执行文件:
我们继续谈谈另一个例子。提供Hancitor恶意软件的恶意文件使用的编码更复杂一些:
这一次,我们有68个独特的字节值,当我们看一个范围的左边时,范围被移位了3个位置,但是当我们看到一个范围的右边时,它们看起来被移位了4个位置。
这怎么解释?
一个假设是,恶意软件是通过将3个位置的某些字节移位而编码的,而另外4个位置的字节进行编码。一个简单的方法是交替这个移位:第一个字节移位3个位置,第二个位移4个位置,第三个位移3个位置,第四个位置4个位置,依次类推…
我们来试试这个假设,使用translate.py根据位置移动3或4个位置:
变量位置是给出字节位置的整数(以0开始),位置%2是除法的剩余部分2.表达式位置%2 == 0对于偶数位置为真,对于不均匀位置为False。IFF是IF函数:如果参数1为真,则返回参数2,否则返回参数3.这是我们如何将输入与3和4交替转换。
但是你可以看到,结果肯定不是BASE64,所以我们的假设是错误的。
我们来试着用4和3(而不是3和4):
这次我们得到BASE64的范围。
使用base64dump.py进行测试证实了我们的假设:
结论
恶意软件作者可以使用通过统计分析和测试简单假设逆向工程的编码方案。而无需执行代码的逆向工程。