恶意代码分析实战13-03

Posted Neil-Yale

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了恶意代码分析实战13-03相关的知识,希望对你有一定的参考价值。

本次实验我们将会分析lab13-03.exe文件。先来看看要求解答的问题
Q1.比较恶意代码的输出字符串和动态分析提供的信息,通过这些比较,你发现哪些元素可能被加密?
Q2.使用静态分析搜索字符串xor来查找潜在的加密。通过这种方法,你发现什么类型的加密?
Q3.使用静态工具,如FindCrypt2、KANAL识别其他类型的加密机制。发现的结果与搜索字符XOR结果比较如何?
Q4.恶意代码使用哪两种加密技术?
Q5.对于每-种加密技术,它们的密钥是什么?
Q6.对于加密算法,它的密钥足够可靠吗?另外你必须知道什么?
Q7.恶意代码做了什么?
Q8.构造代码来解密动态分析过程中生成的一些内容,解密后的内容是什么?

首先启动wireshark进行监控,然后双击运行lab13-03.exe
在这里插入图片描述

可以看到恶意代码尝试通过dns解析域名www.practicalmalwareanalysis.com
在这里插入图片描述

并且尝试建立tcp连接,连接到远程主机的8910端口

接下来啊打开IDA进行分析,打开strings子窗口
在这里插入图片描述

看到了在wireshark中的发现的域名,下面的字符串疑似与某种加密有关,从字面意义可知,如空密钥,不正确的密钥长度,不正确的块长度等等
Q1.比较恶意代码的输出字符串和动态分析提供的信息,通过这些比较,你发现哪些元素可能被加密?
A1.动态分析发现了一个域名。string窗口的输出中没有可以识别的字符串,可能应用了加密,至于是哪些元素被加密则不好判断。

接着在IDA中搜索xor
在这里插入图片描述

结果找到了很多xor,不过我们需要排除用于寄存器清零和库函数相关的xor指令

为了便于我们分析,可以给找到的包含剩下的xor指令的函数分别重命名为s_xor1(2,3,4,5,6)
比如
在这里插入图片描述

Q2.使用静态分析搜索字符串xor来查找潜在的加密。通过这种方法,你发现什么类型的加密?
A2. 搜索xor指令发现了6个可能与加密相关的单独函数,但是加密的类型看不出来。

sub_401ac2是第一个,就重命名为s_xor1
我们使用IDA的find crypt插件来查找
在这里插入图片描述

输出如下
在这里插入图片描述

可以看到是Rijndeal算法,其实就是AES
我们先去第一处看看
查看交叉引用
在这里插入图片描述

注意xor2,xor4通过加密常量Te0关联
再看看解密常量
在这里插入图片描述

查看交叉引用
在这里插入图片描述

xor3,xor5通过解密常量Td0关联
使用peid的krypto analyzer插件的结果如下
在这里插入图片描述

上图的S,S-inv参考了S-box结构,它是一些加密算法的基本机构
和IDA识别出的加密算法是一样的
Q3.使用静态工具,如FindCrypt2、KANAL识别一些其他类型的加密机制。发现的结果与搜索字符XOR结果比较如何?
A3.都识别出了高级加密标准AES算法(Rijndael算法),它与识别的6个XOR函数相关。

我们知道了s_xor2,s_xor4和AES加密相关,而s_xor3,x_xor5与AES解密相关
看看s_xor6
在这里插入图片描述

这里有一个循环,004039e8处的xor指令表明该函数是用于进行XOR加密的
这里的arg_0是一个指针,指向用来进行转换的原缓冲区,arg_4也是指针,指向用来提供异或原数据的缓冲区
在循环中则是通过004039f2,004039f8指令对指向两个缓冲区的指针自增
通过004039cc对计数器变量var_4自增
接着查看s_xor6的交叉引用
在这里插入图片描述

先跟入sub_40352d,查看xrefs from
在这里插入图片描述

从上图中可以看到s_xor6和s_xor2,s_xor4相关
都是加密相关的,所以可以给sub_40352d重命名为s_encrypt
还有s_xor1不知道是做什么的,可以去看看
在这里插入图片描述

通过cmp将arg_0与0比较。如果不正确,往左边走
在这里插入图片描述

会报错空密钥
如果arg_0通过检测,则往右走
在这里插入图片描述

会检测arg_8是否正确,如果错误,往左走
在这里插入图片描述

会报错不正确的密钥长度
如果arg_8正确,往右走
在这里插入图片描述

此时会检测arg_c
如果错误,则往左
在这里插入图片描述

会报错不正确的块长度
那么也就是说s_xor1是密钥的初始化代码
那么s_xor1和之前那几个函数有什么关系呢
可以查看交叉引用
在这里插入图片描述

跟入main函数
在这里插入图片描述

在调用s_xor1之前,存在unk_412ef8的引用,00401890通过ecx将这个偏移量传入s_xor1
我们看看unk_412ef8的其他引用
在这里插入图片描述

跟入第三处
在这里插入图片描述

可以看到,00401429将unk_412ef8的偏移量载入ecx
而随后就是s_encrypt的调用
可知unk_412ef8是一个表示AES加密器的C++对象,并且s_xor1是加密器的初始化函数
前面分析的时候说过,比较arg_0参数,如果失败则会提示空密钥,说明arg_0参数就是一个密钥。
在main中调用s_xor1的地方如下
在这里插入图片描述

最近的一个push是字符串。所以我们可以认为这个字符串被用于进行AES加密
我们来回顾本次AES的流程
先用过交叉引用来到调用s_encrypt的地方
在这里插入图片描述

可以看到对s_encrypt的调用是在WriteFile之前
在这里插入图片描述

在ReadFile之后
而s_xor1是AES初始化函数,会在进程启动时执行
s_xor1设置的AES密码就是之前看到的那串字符串

而我们之前在strings窗口还看到
在这里插入图片描述

联想到我们之前分析过的,这里可能存在base64
Q4.恶意代码使用哪两种加密技术?
A4.恶意代码使用AES和自定义的Base64加密。
Q5.对于每种加密技术,它们的密钥是什么?
A5. AES的密钥是ijklmnopqrstuvwx, 自定义的Base64 加密的索引字符串是:CDEFGHIJKLMNOPQRSTUVWXYZABcdefghi jklmnopqrstuvwxyzab0123456789+/.

查看对其的引用
在这里插入图片描述

跟入sub_40103f查看其交叉引用
在这里插入图片描述

跟入sub_401082查看交叉引用
在这里插入图片描述

跟入StartAddress
在这里插入图片描述

可以看到sub_401082是在ReadFIle和WriteFile之间被调用的,这和我们前面分析的AES很像

前面我们知道s_encrypt是在sub_40132b处被调用的
在这里插入图片描述

查看其交叉引用来到sub_4015b7
在这里插入图片描述

可以看到sub_10432b是一个新线程的开始,这个新线程使用CreateThread创建,所以可以给sub_40132b重命名为aes_thread
传递给线程的参数保存在lpParameter,也就是var_58中
00401826处var18移入var_58
0040182c处arg_10移入var_54
00401835处dwrord_41336c移入var_50
然后跟进aes_thread看看这些参数在函数中的流程
先看ReadFile
在这里插入图片描述

其参数hFile来自var_BE0
往上回溯,可知其来自该函数的唯一参数
在这里插入图片描述

回到上层函数
在这里插入图片描述

可以看到唯一的lpParameter参数来自var_58,或者说来自var_18
在看看ase_thread的WriteFile
在这里插入图片描述

去参数hFIle来自var_BE0+4,就是var_54或者说是arg_10

我们看到var_58和var_18持有一个管道的句柄,并且这个管道的与一个shell命令的输出相连接
在这里插入图片描述

命令hSourceHandle通过DuplicateHandle复制到shell命令的标准输出和标准错误
在这里插入图片描述

这条shell命令由CreateProcess启动

而var_54或者说arg_10往前回溯
在这里插入图片描述

看到是sub_4015b7的唯一参数
查看交叉引用来到main
在这里插入图片描述

如下所示
在这里插入图片描述

可知其参数来自ebp+s,而它是用connnect调用创建的一个网络套接字
那么我们也就知道了,aes_thread用于读取shell命令的输出结果,在写入网络套接字之前加密它
而base64加密函数也在一个由他们宿主进程启动的函数中使用,所以我们猜测base64线程会读取远程套接字的内容作为输入,经过解密后,再将结果发送作为命令shell的输入
Q6.对于加密算法,它的密钥足够可靠吗?另外你必须知道什么?
A6.对于自定义Base64加密的实现,索引字符串已经足够了。但是对于AES, 实现解密可能需要密钥之外的变量。如果使用密钥生成算法,则包括密钥生成算法、密钥大小、操作模式,如果需要还包括向量的初始化等
Q7.恶意代码做了什么?
A7.恶意代码使用以自定义Base64加密算法加密传入命令和以AES加密传出shell命令响应来建立反连命令shell。

我们已经知道了程序中有两种类型的加密。
先看看如何解密base64
脚本如下(1.py),这里是假设截取到网络通信的部分信息为BInaEi==
在这里插入图片描述

运行后得到解密结果为dir
也就是说攻击者尝试发送的是一个shell命令dir,用于列目录

再解密AES
假设通过wireshark捕获到的加密内容为
在这里插入图片描述

解密脚本如下
在这里插入图片描述

raw是我们捕获到的原始内容
2处是删除字符串中的空格,并将16进制转为2进制
3处是我们在IDA中找到的密钥
4处解密
运行后得到的解密结果为
在这里插入图片描述

Q8.构造代码来解密动态分析过程中生成的一些内容,解密后的内容是什么?
A8.如何解密内容的具体过程,请查看上文,这里不再复述。

以上是关于恶意代码分析实战13-03的主要内容,如果未能解决你的问题,请参考以下文章

恶意代码分析实战3-2

恶意代码分析实战11-1

恶意代码分析实战9-1

恶意代码分析实战14-02

恶意代码分析实战11-2

恶意代码分析实战15-3