恶意代码分析实战13-02

Posted Neil-Yale

tags:

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

本次实验我们将会分析lab13-02.exe文件。先来看看要求解答的问题
Q1.使用动态分析,确定恶意代码创建了什么?
Q2.使用静态分析技术,例如xor指令搜索、FindCrypt2、KANAL等查找潜在的加密,你发现了什么?
Q3.基于问题1的回答,哪些导入函数将是寻找加密函数比较好的一个证据?
Q4.加密函数在反汇编的何处?
Q5.从加密函数追溯原始的加密内容,原始加密内容是什么?
Q6.你是否能够找到加密算法?如果没有,你如何解密这些内容?
Q7.使用解密工具,你是否能够恢复加密文件中的一个文件到原始文件?
首先使用Process monitor进行监控
在这里插入图片描述

双击启动Lab13-02.exe
在这里插入图片描述

从process monitor中可以看到,生成了一些文件
在这里插入图片描述

来到lab13-02.exe所在的目录下,确实生成了一些似乎是随机字符串作为文件名的文件
Q1.使用动态分析,确定恶意代码创建了什么?
A1. Lab13-02.exe在当前目录下创建一些较大且看似随机的文件,这些文件的命名以temp开始,以不同的8个十六进制数字结束。
而且在crete创建之后由一系列的writefile写文件
在这里插入图片描述

接下来我们尝试使用静态分析技术找到加密的证据

Q3.基于问题1的回答,哪些导入函数将是寻找加密函数比较好的证据?
A3. WirteFile 调用之前可能会发现加密函数。
peid载入后使用插件查找
在这里插入图片描述

从结果可知没有找到
如图所示启动即可
接着可以使用IDA的findcrypt插件,可以去网上下载
在这里插入图片描述

将其放入IDA的plugin即可
接着ida载入lab13-02.exe,如下所示操作
在这里插入图片描述

选择后在输入窗口中并没有显示结果
在这里插入图片描述

接下来搜索一下xor
在这里插入图片描述

结果如下
在这里插入图片描述

像第一条这种异或自身的,表示对寄存器清零
而下面几条function栏为空的,表示时库函数中的指令
排除这些之后,剩下的有助于我们分析都是在sub_40128d和sub_401739,根据xor指令的多少,我们分别给其重命名为single_xor,heavy_xor
Q2.使用静态分析技术,例如xor指令搜索、FindCrypt2、KANAL等,查找潜在的加密,你发现了什么?
A2. XOR搜索技术在sub__401728d 和sub_401739 中识别了加密相关的函数。其他推荐的技术并没有发现什么。

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

看到有四个参数,而且有一个循环
在这里插入图片描述

在循环里,除了xor指令外,还有很多SHL,SHR指令用于移位的操作
我们可以看看其调用情况
在这里插入图片描述

可以看到heavy_xor调用sub_4012dd,而sub_4012dd会调用single_xor
我们猜测heavy_xor是一个加密函数,为了证实猜测,我们需要找到它和那些temp文件的关系。我们前面看到有很多writefile的操作,所以在IDA的import窗口我们找到writefile
在这里插入图片描述

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

我们先看第一处,双击跟入sub_40100
在这里插入图片描述

看到有三个参数,分别为缓冲区,缓冲区长度,和文件名
看到依次调用了CreateFile来打开或创建文件
在这里插入图片描述

调用WriteFile用于写入
那么我们就知道了这个函数的作用就是打开一个文件并将缓冲区中的数据写到这个文件里。我们给这个函数重命名为writeBuffertoFile
来看看是哪个函数调用了它
在这里插入图片描述

交叉引用后跟入sub_401851
在这里插入图片描述

可以看到调用了sub_401070,sub_40181f
其参数都为缓冲区和缓冲区的长度
之后是调用GetTickCount,根据00401895处的格式化字符串可知,这就是打印文件名的地方,文件名的后半部分是当前时间的十六机制
我们推测,sub_401070用于获取内容,sub_40181f用于加密内容
Q4.加密函数在反汇编的何处?
A4.加密函数是sub_40181F

将其分别重命名为getcontent,和encodecontent
先来看看encodecontent
在这里插入图片描述

看到调用了heavy_xor
在调用前入栈了4个参数
00401841处的var_44是第一个参数,是之前通过memset清空的本地变量
第2,3个参数都是arg0,是指向同一个缓冲区的指针
第四个参数是arg_4,是缓冲区的大小

接着我们去getcontent函数
在这里插入图片描述在这里插入图片描述
在这里插入图片描述

GetDesktopWindow获取覆盖整个屏幕桌面窗口的一个句柄,函数BitsBlt,GetDIBits获取位图信息并把他们复制到缓冲区
我们猜测,这是用于抓屏
而上一层函数这是将抓屏信息加密后写到temp开头的文件里
Q5.从加密函数追溯原始的加密内容,原始加密内容是什么?
A5.原内容是屏幕截图。
为了验证我们的想法,我们用抓取到的文件,通过加密算法逆向运行,看是否能够得到原始的抓屏图片
我们使用immunity载入程序,先在encodecontent下断点
ida查看位置
在这里插入图片描述

然后在immunity debugger通过ctrl+g跳到该位置
在这里插入图片描述

下断点
第二个断点下在第一个文件写入后,在main中找位置
在这里插入图片描述

sub_401851是我们分析的,所以我们断在0040190a
两个断点下好后如图所示
在这里插入图片描述

之后点击运行,就命中第一个断点了
再次运行,命中第二个断点。此时已经生成文件了
在文件夹中找到该文件
在这里插入图片描述

将创建时间与系统时间对比,可见这个就是刚生成的
接着再次运行,这样就又命中第一个断点的位置了
此时在下图可以看到
在这里插入图片描述

堆栈上这两个参数就是加密的缓冲区和长度
右键选择缓冲区,follow in dump
在这里插入图片描述

在箭头所指的窗口中就看到缓冲区的内容了
接下来winhex载入刚才生成的文件,如下操作
在这里插入图片描述

回到Immunity debugger
全选缓冲区内容,右键如下所示
在这里插入图片描述

接下来再次点击运行
接着回到文件夹,通过对比时间可以知道,生成一个新的文件
在这里插入图片描述

给该文件加上bmp后缀
打开后如图所示
在这里插入图片描述

可以看到确实如我们分析的一样,是抓屏的操作,而且我们进行了解密的操作
那么我们大概就知道了,该程序采用的加密算法是可逆的,所以我们才可以用第二次加密的操作通过替换缓冲区的内容实现了解密

除了这种手动的方式外,我们还可以通过编程实现自动化
编写一个python脚本如下所示
在这里插入图片描述

将其移动到immunity debugger的pycommand目录下
在这里插入图片描述

接下来说一下脚本中的重点:
在这里插入图片描述

脚本中设置断点的位置与之前不同,如上所示,之前是00401880,而我们这次需要自己设置入栈的参数,所以断点的位置需要在参数入栈之前,这里选择00401875
open打开的文件就是之前生成的第一次加密得到的文件,为了写路径的时候方便,把该文件复制到根目录下
在这里插入图片描述

后面的EBP-12,EBP-8是用于设置缓冲区及其大小
因为401880或者说encodecontent是两个参数入栈,在immunity debugger中可以看到
在这里插入图片描述

分别为EBP-8,EBP-C,c就是10进制的12

在immunity debugger下执行
在这里插入图片描述

这里的run是python脚本的名字
执行后得到的文件加上bmp后缀后就可以打开了。
说明我们的脚本也是可以工作的。
Q6.你是否能够找到加密算法?如果没有,你如何解密这些内容?
A6.加密算法是不标准算法,并且不容易识别,最简单方法是通过解密工具解密流量。
Q7.使用解密工具,你是否能够恢复加密文件中的一个文件到原始文件?
A7.如何还原加密文件的原始内容的过程比较繁琐,可以查看上文的详细分析过程,这里不再复述

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

恶意代码分析实战3-2

恶意代码分析实战11-1

恶意代码分析实战9-1

恶意代码分析实战14-02

恶意代码分析实战11-2

恶意代码分析实战15-3