本次实验我们将会分析lab13-01.exe文件。先来看看要求解答的问题
Q1.比较恶意代码中的字符串(字符串命令的输出)与动态分析提供的有用信息,基于这些比较,哪些元素可能被加密?
Q2.使用IDA Pro搜索恶意代码中字符串’xor’ ,以此来查找潜在的加密,你发现了哪些加密类型?
Q3.恶意代码使用什么密钥加密,加密了什么内容?
Q4.使用PEiD插件识别一些其他类型的加密机制,你发现了什么?
Q5.什么类型的加密被恶意代码用来发送部分网络流量?
Q6.Base64编码函数在反汇编的何处?
Q7.恶意代码发送的Base64加密数据的最大长度是什么?加密了什么内容?
Q8.恶意代码中,你是否在Base64加密数据中看到了填充字符(=或者==) ?
Q9.这个恶意代码做了什么?
先通过wireshark抓包监控
过滤出http之后,主要到有个get请求,访问的是www.practicalmalwareanalysis.com,但是get后面的字符串似乎是编码或者混淆过的(注意,这一字符串可能会根据主机不同而不同)
接下来将其载入IDA
打开strings窗口
可以看到Mozilla/4.0,这和我们在wireshark中看到的user-agent是一样的,可是除此之外,那个网址和字符串在strings都没找到
Q1.比较恶意代码中的字符串(字符串命令的输出)与动态分析提供的有用信息,基于这些比较,哪些元素可能被加密?
A1.网络中出现两个恶意代码中不存在的字符串(打开strings窗口,没有字符串输出)。一个字符串是域名www. practicalmalwareanalysis . com,另外一个是GET请求路径,它看起来像eWDFszs02oDllm2u3(注意,这是随机的,在实验时可能会有所不同)。
接下来使用IDA搜索所有xor
search-》text
点击ok
搜索结果如上
xor自身,是用于清空寄存器,除此之外,只有三个是符合的,但是最后两个是库代码,所以可以看到他们的function是没有列出函数名的。
现在只剩下xor eax,3bh
双击跟入
可以看到这里是一个循环,循环中递增的是计算器var_4
异或的地方在004011b8,用0x3b与eax异或,而eax来自缓冲区arg_0
这里的arg_4则是缓冲区的长度
所以我们知道了这里是实现用0x3b执行单字节的异或加密,并将缓冲区即其长度作为参数。所以可以给该函数重命名为xorEncode
Q2.使用IDA Pro搜索恶意代码中字符串’xor’ ,以此来查找潜在的加密,你发现了哪些加密类型?
A2.地址004011B8处的xor指令是sub_401190 函数中一个单字节XOR加密循环的指令
对其查看交叉引用
看到sub_401300是唯一调用xorEncode的函数。双击跟入
在调用位置之前看看之前的代码
看到调用了GetModuleHandleA,FIleResourceA,SizeofResource,GlobalAlloc,LoadResource和LockResource。大部分是与资源相关的函数。
先关注用于找到资源的函数FindResourceA
看到传入的lpType参数为0xA,查阅msdn知
表示资源数据时应用程序预定义的资源类型是原始数据。
lpName在IDA中可以看到是索引号65h,10进制为101
可以打开resource hacke
找到索引号为101的RCDATA
上图中可以看到资源在偏移量0x7060,长度为32字节
将其保存为13.1.exe
接下来可以通过winhex打开13.1.exe,然后与3b异或,具体操作如下
edit->modify data
点击ok后结果如图
可以看到显示出了wireshark抓到的网址
Q3.恶意代码使用什么密钥加密,加密了什么内容?
A3.单字节XOR加密使用字节0x3B。解密的XOR加密缓冲区的内容是WWW. practicalmalwareanalysis . com。
我们现在还有GET请求那一段字符串还没有找到,推测也是被加密过的
可以通过peid载入,通过图示的插件进行查找
结果如下
Q4.使用PEiD插件识别一些其他类型的加密机制,你发现了什么?
A4. 用插件PEiD KANAL可识别出恶意代码使用标准的Base64编码字符串:ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/
在4080e8的位置找到了base64的编码表
回到IDA直接跳到这里
如下所示
可以看到这些其实就是大小写的A到Z,以及数字和+,/
我们看一下这个字符串的交叉引用
看到四处的交叉引用都在sub_401000。跟入
将其重命名,方便后续分析
往下看
在箭头所指向的位置的3Dh实际上就是=
因为base64加密中是用‘=’作为填充字符的,所以也印证了这是base64
Q5.什么类型的加密被恶意代码用来发送部分网络流量?
A5.标准的Base64编码用来创建GET请求字符串
接下来我们看看在哪儿调用这个函数的
跟入sub_4010b1
Q6.Base64编码函数在反汇编的何处?
A6. Base64 加密函数从0x004010B1处开始。
这里的结构很繁杂,可以f5看伪码
上图所示为主体部分
17行是一个while.判断v10是否小于v9
15行看到v10初值为0,在32行可以看到v10自增
而13,14行看到v9是字符串长度
那么也就说这个while的目的就是对源字符串的每个字符都进行接下来的操作
20行处的for是将字符串进行三字节一组的切割,也就是将字符串划分成3字节的块,保存在v7中
24行开始的if-else是用于判断是否赋值完毕,完毕则在v7最后加上0表示结束,否则自增
然后在37行看到是将3字节块传给base64index,而38行的循环这里是用于将传入的3字节加密成4字节
可见这就是base64编码的主函数,可以重命名为base64encode
34=12,44=16
Q7.恶意代码发送的Base64加密数据的最大长度是什么?加密了什么内容?
A7. Base64 加密前,Labl3-01.exe 复制最大12个字节的主机名,这使得GET请求的字符串的最大字符个数是16,加密的内容为请求的字符串。
查看交叉引用
来到了这里
看到,base64encode的传入的字符串来自var_18,是strncpy的输出
而strncpy的输入是00401201处gethostname的输出,所以我们就知道了get后面的字符串是主机名经过base64加密后得到的
在00401209看到的0c是10进制的12,说明strncpy仅复制主机名的前12字节
这样就可以回到第8个问题:只有在主机名小于12个字符且主机名的长度不能被3完全整除时,才可能看到=的填充
Q8.恶意代码中,你是否在Base64加密数据中看到了填充字符(=或者==) ?
A8.如果主机名小于12个字节并且不能被3整除,则可能使用填充字符
接下来看看剩下的,调用了InternetOpenA,InternetOpenUrlA,InternetReadFile用于打开并读取之前形成的url
成功返回后会在004012f1与6fh,也就是字符o进行比较
如果是o,则走左边,将eax赋1
如果不是o,则走右边,通过xor异或自身,清空eax,也就是给eax赋0
那么我们看看sub_4011c9的交叉引用
跟入
是在main中
可以看到在一个循环里,通过test eax,eax判断返回值是否为0,如果是0则继续循环,如果不是0则结束,也就是说,当sub_4011c9真(获得以o开始的web响应的时候,就会退出循环,结束程序)
总的来说,恶意代码发送通信信号,让攻击者知道它在正常运行。具体来说,恶意代码用加密的主机名作为标识符发出一个特定的通信信号,当收到以o开始的web响应时,则终止。
Q9.这个恶意代码做了什么?
A9. Labl3-01.exe 用加密的主机名发送一个特定信号,直到接收特定的回应后退出。
。