恶意代码分析实战-实验9

本文最后更新于:2021-09-07 中午

Lab 9-1

详细分析

打开程序,首先看到判断当前程序是否带了参数,如果带了参数,就进行后面的操作,如果没有带参数,会尝试打开一个键值,如果不存在此键值,则程序自删除,如果存在就会开始和服务器端通信,这些后面再说。

之后会进行判断,首先判断当前输入的最后一个参数是否等于abcd。

然后就是判断输入的第一个参数是什么,-in,-re,-c,-cc。

-in

-in参数,首先创建了一个系统服务

然后将自身复制到system32下

然后创建注册表表项,并且设置键值

恶意代码安装的服务

设置的键值

-re

-re参数是删除配置信息,将服务删除,复制的文件删除,注册表信息也清空。

刚才创建的键值已经被删除

-c

-c参数是设置自己的配置信息,根据-c后面的四个参数进行设置

输入1 2 3 4

-cc

-cc 是打印当前的配置信息

打印出来的信息

如果参数不符合要求都会进行自删除

后门

不带任何参数,且有配置信息的情况下,会执行连接服务器,并且根据服务器指令执行操作。

获取注册表中的配置信息

指令共有五种,分别是sleep,upload,download,CMD,nothing

sleep

会执行sleep函数

upload

是下载一个文件

download

发送内容

CMD

会执行一个命令

nothing

什么都不做

1.如何让这个恶意代码安装自身?

从上数分析可以知道,需要使用-in选项。

2.这个恶意代码的命令行选项是什么?它要求的密码是什么?

命令行选项有四种,-in,-re,-c,-cc密码是abcd

3.如何利用OD永久修补这个恶意代码,使其不需要指定的命令行密码

修改跳转条件即可,这只是其中的一种方法,将JNZ修改为JMP。

4.这个恶意代码基于系统的特征是什么?

本地创建的名为Lab9-01的服务,还创建了一个XPS表项,其中的键值是连接所需的参数。

5.这个恶意代码通过网络命令执行了哪些不同操作?

上述分析已经分析清楚。

6.这个恶意代码是否有网络特征?

有网络的连接,域名是http://www.practicalmalwareanalysis.com

Lab 9-2

详细分析

程序的整体流程比较简单。

首先程序会进行比较,比较当前运行的程序是否是ocl.exe

然后会在401089函数中进行解密,是一个异或解密。

解密后的域名

之后会连接域名,然后会调用401000,在其中创建了一个进程

1.在二进制文件中,你看到的静态字符串是什么?

只能看到这些字符串

2.当你运行这个二进制文件时,会发生什么?

不会发生什么,应该是会创建一个CMD进程。

3.怎样让恶意代码的攻击负载(payload)获得运行?

将名字改为ocl.exe

4.在地址0x00401133处发生了什么?

将一些数据赋值给一个地址,主要是为了隐藏字符串,这也是为什么刚才字符串窗口并没有什么有用的信息,shellcode的编写手法之一,可以参考shellcode学习

5.传递个子例程(函数)0x00401089的参数是什么?

是这两个参数,其中一个是加密的字符串

另一个是用来进行异或解密的数据

6.恶意代码使用的域名是什么?

www.practicalmalwareanalysis.com

7.恶意代码使用什么编码函数来混淆域名?

异或

8.恶意代码在0x0040106E处调用CreateProcessA函数的意义是什么?

这块用书上的话来说是一个反向的SHELL,

书上的原话:

1
STARTUPINFO结构中的标准流被设置为一个套接字。这直接绑定套接字和cmd.exe的标准流,所以cmd.exe被启动后,所有经过套接字的数据都将发送到cmd.exe,并且cmd.exe产生的所有输出都将通过套接字发出。

这里我并没有分析出来,就借用了书上的解答。

Lab 9-3

详细分析

整体流程也是比较简单的,可以看到首先是调用了三个DLL中的函数,然后是writefile函数向某文件写入数据。

运行DLL主要会打印出这三行信息,下面来仔细分析一下到底做了什么。

DLL1

先来看看第一个DLL。

可以看到这是DLL1Print函数,其中dword_10008030就是打印的数据,可以查看交叉引用,看看究竟是什么。

可以看到这个值是当前进程的PID

DLL2

再来看第二个DLL,这是导出函数 DLL2Print,看到dword_1000B078是其打印的数据,还是交叉引用查看。

可以看到是这个数据是创建文件的句柄。

而另一个导出函数DLL2ReturnJ可以看到返回了一个值,从上图可以看到这个值就是文件的句柄。

DLL3

DLL3有两个导出函数

DLL3Print打印信息,可以看到是&WideCharStr,交叉引用查看。

可以看到这是MultiByteToWideChar函数的一个参数,而这个参数作用是

1
2
lpMultiByteStr
指向要转换的字符串的指针。

这个函数作用是将字符串映射到 UTF-16(宽字符)字符串,也就是&WideCharStr这其中保存着转为宽字符后的数据的地址。

导出函数DLL3GetStructure返回了一个值,从上图可以看出,这里其实是返回了一个结构体的地址。

1.Lab9-3.exe导入了哪些DLL?

导入了四个DLL

2.DLL1.dll、DLL2.dll、DLL3.dll要求的基址是多少?

都是10000000

3.当使用OD调试时,为DLL1.dll、DLL2.dll、DLL3.dll分配的基址是什么?

分别是200000,、210000、220000

4.当调用DLL1.dll中的一个导入函数时,这个导入函数都做了些什么?

打印出了当前的进程的PID

5.当调用writefile函数时,写入的文件名是什么?

temp.txt

6.当调用NetScheduleJobAdd创建一个job时,从哪里获取第二个参数的数据?

从DLL3中的DLL3GetStructure获取

7.在运行或调试时,会看到程序打印出三块神秘数据。DLL1.dll、DLL2.dll、DLL3.dll它们的神秘数据分别什么?

前面详细分析可知,第一个是当前进程的PID,第二个是文件句柄,第三个是保存着宽字符数据的地址。

8.如何将DLL2.dll加载到IDA PRO中,使得它与OD使用的加载地址匹配?

可以在IDA里Edit–>Segments–>Rebase Program改变基址