10.1 Lab13-01
- 比较恶意代码中的字符串(字符串命令的输出)与动态分析提供的有用信息,基于这些比较,哪些元素可能被加密?
使用WireShark进行动态分析。
有一串字符看起来像是加密的。
使用Strings分析一下。
发现疑似Base64的存在痕迹。
没有发现上面看到的疑似加密的字符串和网址。可能是加密了。
- 使用IDAPro搜索恶意代码中字符串xor,以此来查找潜在的加密,你发现了哪些加密类型?
使用IDA查找所有xor位置。
这里面唯一看着像是加密的是这行命令。
:::info
xor eax, 3Bh
:::
对字符进行了xor的3Bh操作。
- 恶意代码使用什么密钥加密,加密了什么内容?
交叉引用,进入函数调用处。
对资源进行了很多操作。
我们怀疑加密数据就在资源节中。
使用ResourceHacker查看。
使用WinHex进行修改。
是一个网址。
- 使用静态工具FindCrypt2、Krypto ANALyzer(KANAL)以及 IDA熵插件识别一些其他类型的加密机制,你发现了什么?
使用Krypto ANALyzer插件进行分析。
发现base64编码表。
在IDA上跳转到这个地址。
- 什么类型的加密被恶意代码用来发送部分网络流量?
函数嵌套了很多轮,最终在main函数中看到了,是将GET请求进行了标准的Base64加密。
- Base64编码函数在反汇编的何处?
这里就是Base64编码函数的位置。
- 恶意代码发送的 Base64加密数据的最大长度是什么?加密了什么内容?
函数开头使用strlen查找原字符串的长度,在外部循环(代码块loc_401100)的开头与3比较,在下图处于4比较。
这一点更加确定这是Base64加密。
Base64加密前,Lab13-01.exe复制最大12个字节的主机名,这使得GET请求的字符串的最大字符格个数是16.
- 恶意代码中,你是否在 Base64加密数据中看到了填充字符(=或者==)?
如果主机名小于12个字节并且不能被3整除,则可能使用填充字符。
- 这个恶意代码做了什么?
Lab13-01.exe用加密的主机名发送一个特定信号,知道接受待定的回应后退出。
10.2 Lab13-02
- 使用动态分析,确定恶意代码创建了什么?
运行程序后,使用Promon进行监控,发现有很多创建和写入文件的操作。
回到程序所在目录,发现创建了很多文件,使用WinMD5确认不是同一个文件。
- 使用静态分析技术,例如 xor指令搜索、FindCrypt2、KANAL以及IDA熵插件,查找潜在的加密,你发现了什么?
使用FindCrypt2,没发现什么。
使用KANAL。
也没有发现什么。
使用IDA的xor寻找。
查看函数调用。
- 基于问题1的回答,哪些导入函数将是寻找加密函数比较好的一个证据?
我们看到了WriteFile函数被多次调用,我们怀疑这个导入函数是寻找加密函数的较好证据。
- 加密函数在反汇编的何处?
GetTickCount 函数,返回子系统启动以来的毫秒数,应该是用来写入文件名字的。
那么下面的函数应该就是加密函数了。
- 从加密函数追溯原始的加密内容,原始加密内容是什么?
进入这个函数查看。
分析API函数可知,该函数的作用是截图屏幕,也就是原始加密内容。
- 你是否能够找到加密算法?如果没有,你如何解密这些内容?
加密算法已经找到,但该算法并不是标准的算法,可以使用ImmunityDbg进行解密。
- 使用解密工具,你是否能够恢复加密文件中的一个文件到原始文件?
在加密前和加密后下断点。
首先运行至获取加密文件,使用WinHex打开文件,复制文件内容。
粘贴到ImmunityDbg。
运行之后获得解密文件,修改后缀为bmp后,打开图片。
解密成功。
或者换一种方式,使用Python脚本。
10.3 Lab13-03
- 比较恶意代码的输出字符串和动态分析提供的信息,通过这些比较,你发现哪些元素可能被加密?
使用WireShark动态分析,发现一个网址。
使用IDA分析,看到Base64加密的字符表。
- 使用静态分析搜索字符串xor来查找潜在的加密。通过这种方法,你发现什么类型的加密?
搜索xor指令发现了6个可能与加密相关的单独函数,但是加密的类型一开始并不明显。
- 使用静态工具,如FindCrypt2、KANAL 以及 IDA熵插件识别一些其他类型的加密机制。发现的结果与搜索字符XOR结果比较如何?
KANAL。
FindCrypt2。
发现了AES加密算法。
- 恶意代码使用哪两种加密技术?
恶意代码使用AES和自定的Base64加密。
- 对于每一种加密技术,它们的密钥是什么?
· Base64的密钥。
xor6的加密循环。
查看一段代码。
s_xor2和s_xor4调用加密常量。
s_xor3和s_xor5调用解密常量。
该函数调用二和4,所以是加密函数。
分析s_xor1,可以得知,这是一个密钥初始化函数。
由此我们也找到了密钥。
- 对于加密算法,它的密钥足够可靠吗?另外你必须知道什么?
对于自定义的Base64加密的实现,缩印字符串已经足够了。凡是对于AES,实现解密可能需要密钥之外的变量。如果使用密钥生成算法,则包括密钥生成算法,密钥大小,操作模式,如果需要还包括向量的初始化。
- 恶意代码做了什么?
恶意代码使用自定义的Base64加密算法加密传入命令和以AES加密传出shell命令响应来建立反连命令shell。
- 构造代码来解密动态分析过程中生成的一些内容,解密后的内容是什么?
使用Python编写解密脚本。
import string
import base64
S = ""
tab = 'CDEFGHIJKLMNOPQRSTUVWXYZABcdefghijklmnopqrstuvwxyzab0123456789+/'
b64 = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/'
ciphertext = 'BInaEi=='
for ch in ciphertext:
if(ch in tab):
S += b64[string.find(tab, str(ch))]
elif(ch == '='):
S += '='
print base64.decodestring(S)
运行结果。
AES解密,失败。
# pip install pycryptodome
from Crypto.Cipher import AES
import binascii
raw = 'eb 63 85 35 e8 45 cc e9 5c 92 36 9d 31 d5 3c 01' + \
'8e bf e5 8b 06 e1 48 3f 42 5c 5a 0a 4c 75 b2 fa' + \
'7a c5 3c 27 f2 04 d2 25 d8 e6 c5 d5 78 03 34 98' + \
'49 5e 4f fd f7 dd 63 a6 91 0e 81 06 cc a8 62 ac' + \
'74 f2 4a 26 e7 b2 55 03 d3 71 c8 a9 4c 61 c0 65'
ciphertext = binascii.unhexlify(raw.replace(' ', ''))
obj = AES.new('ijklmnopqrstuvwx', AES.MODE_CBC)
print obj.decrypt(ciphertext)