恶意代码分析实战-实验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 |
|
这里我并没有分析出来,就借用了书上的解答。
Lab 9-3
详细分析
整体流程也是比较简单的,可以看到首先是调用了三个DLL中的函数,然后是writefile函数向某文件写入数据。
运行DLL主要会打印出这三行信息,下面来仔细分析一下到底做了什么。
DLL1
先来看看第一个DLL。
可以看到这是DLL1Print函数,其中dword_10008030就是打印的数据,可以查看交叉引用,看看究竟是什么。
可以看到这个值是当前进程的PID
DLL2
再来看第二个DLL,这是导出函数 DLL2Print,看到dword_1000B078是其打印的数据,还是交叉引用查看。
可以看到是这个数据是创建文件的句柄。
而另一个导出函数DLL2ReturnJ可以看到返回了一个值,从上图可以看到这个值就是文件的句柄。
DLL3
DLL3有两个导出函数
DLL3Print打印信息,可以看到是&WideCharStr,交叉引用查看。
可以看到这是MultiByteToWideChar函数的一个参数,而这个参数作用是
1 |
|
这个函数作用是将字符串映射到 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改变基址
本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!