恶意代码分析实战9-1

Posted Neil-Yale

tags:

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

本次实验我们将会分析lab09-01.exe。先来看看要求解答的问题
Q1.如何让这个恶意代码安装自身
Q2这个恶意代码的命令行选项是什么
Q3.如何利用ollydbg永久修补这个恶意代码,使其不需要指定的命令行密码
Q4这个恶意代码就有系统的特征是什么
Q5.这个恶意代码通过网络命令执行了哪些不同操作?
Q6.这个恶意代码是否有网络特征?
接下来跟着分析流程,我们会依次回答这六个问题。

IDA载入本次实验文件,在main处查看交叉引用,看看是在哪儿调用了main
在这里插入图片描述

双击跟入
在这里插入图片描述

可以看到是在403945处调用了main
我们在ollydbg打开该程序,然后跳到403945
在这里插入图片描述

下断点,执行过来
然后f7单步步进,就来到了main函数中
在这里插入图片描述

在402afd中看到了一个cmp,结合IDA
在这里插入图片描述

可知这是在比较命令行参数的数量是否为1,由于我们没有指定任何参数,所以检查成功,体现在IDA中就是往右边走,会调用sub_401000,跟入
在这里插入图片描述

可以看到sub_401000是在试图打开HKLM\\SOFTWARE\\Microsoft\\XPS,由于注册表项不存在,所以会往左走,通过xor指令给eax赋0,也就是返回0
回到上一层函数,也就是main中
在这里插入图片描述

由于返回0,所以接下来会调用sub_402410,跟入该函数
在这里插入图片描述在这里插入图片描述

该函数使用GetModuleFilenameA获取当前可执行文件的路径,并构造出一个ASCII字符串 /c dell 文件路径 >> null
具体的字符串可以在od中跳到4024ee,也就是调用ShellExecuteA的位置,在该位置下断点,执行
在这里插入图片描述

然后选中edx的数值,如下操作
在这里插入图片描述

此时在左下角的窗口可以看到
在这里插入图片描述

要删除的正是恶意文件自身
那么怎么才能让它可以恰当运行呢
我们可以尝试给恶意代码提供足够的参数,满足402afd处的检查
我们使用string看看可能的字符串参数
在这里插入图片描述

-in可能是install的缩写
我们用它进行测试
在od中如下操作
在这里插入图片描述

在弹出的框中输入-in
在这里插入图片描述

重新调试
在od中在402afd下断点,执行过来
在这里插入图片描述

可以看到因为接下里将会跳到402b1d,对应在IDA中也就是往左边走
在这里插入图片描述

标准c程序的main函数只带有两个参数:argc是参数的个数,argv是指向命令行参数的一个数组指针。EAX包含argc,ECX包含argv
402b23处的指令执行指针算法来选择命令行参数数组中的最后一个元素。结合接下来的指令可知,这个指针最后在eax中,在函数调用之前被压入到栈顶,可以看到最后一个命令行参数被传入到sub_402510,跟入该函数
在这里插入图片描述

可以看到,使用了ADD,SUB,MUL,XOR等指令,可能是通过某种算法对输入的参数进行检查
逆向这个算法比较麻烦,可以换种思路,可以patch二进制文件,使得sub_402510会返回与成功检查响相应的值
Q1.如何让这个恶意代码安装自身
A1.通过提供密码和-in选项,你可以让程序安装自己。另外,你可以通过修补二进制代码,来让程序跳过密码验证。

将IDA视图拖到最下面
在这里插入图片描述

可以看到,比较不成功的是红色,成功是绿色
红色的线指向的指令就是给eax赋0,然后执行4025a0开始的指令。绿色的线是给eax赋1,然后和红色的一样执行4025a0开始的指令
那么我们插入控制eax为1的指令就可以了
指令为mov eax,0x1 ret
对应的机器码为B8 01 00 00 00 C3
因为call指令准备堆栈,RET指令负责清理栈,我们可以覆盖检查函数的开头指令,我们在402510处patch
如下所示进行操作
在这里插入图片描述

因为原先该空间只占1字节,现在我们要写入6字节,所以去掉keep size框,输入机器码,点击ok
在这里插入图片描述

此时在相应的位置上显示出了新的指令。
在这里插入图片描述

然后将其保存,如下操作
在这里插入图片描述

Copy all
在这里插入图片描述

将其保存为如下名字的文件
在这里插入图片描述

接下来od载入patch过的文件,注意要debug-》argument加上-in参数
然后在00402b38下断,执行过来
在这里插入图片描述

从上图中可以看到跳转会成功执行,下一步就会来到402b3f。说明我们的patch是成功的

Q3.如何利用ollydbg永久修补这个恶意代码,使其不需要指定的命令行密码
A3.你可以通过更改地址0x402510处函数开头的几个字节,让函数总是返回true, 来修补这个二进制文件。完成这种行为的汇编指令是MOV EAX, 0x1; RETN;,它对应的字节序列是B801 00 00 00 C3

在od中继续单步
在这里插入图片描述

继续单步
在这里插入图片描述

有两次push,内容都是ascii字符串”-in”
在这里插入图片描述

结合IDA查看
在这里插入图片描述

之后就是将这两个字符串传给mbscmp,这是一个字符串匹配函数。如果传入的参数是-in
则往左边走
在这里插入图片描述

在402b63检查参数个数是否为3,如果是3,则走左边,如果不是,则往右边,在402b9a检查参数个数是否为4个,如果不是,往左,如果是4个,则往右
在这里插入图片描述

换句话说,如果参数个数不是3个也不是4个,则会调用sub_402410,这个函数我们之前分析过,就是用于删除自身的
所以我们要在-in后面加上任意参数
在这里插入图片描述

然后重新调试
在402b67处下断点
在这里插入图片描述

可以看到跳转没有发生,接下来继续执行会来到402b69,如下所示
在这里插入图片描述

结合IDA
在这里插入图片描述

在od中在402b7f下断点,执行,查看跳转是否发生
在这里插入图片描述

可以看到之后会从402b89开始执行
接下来会调用sub_402600,跟入

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

在4026cc处打开一个服务管理器。然后调用OpenService打开一个已存在的服务,如果服务不存在,则恶意代码以管理器服务basename作为名字,调用CreateServieA创建一个自启动的服务,并且设置二进制路径为%systemroot%\\system32<filename>
在这里插入图片描述

在4028a1处,恶意代码将自己复制到%systemroot%\\system\\目录下。
在这里插入图片描述

之后调用sub_4015b0,改变了复制文件的修改的、访问、最后变化时间戳,来与那些kernel32.dll等系统文件保持一致
在这里插入图片描述

然后调用sub_401070,跟入
在这里插入图片描述

恶意代码创建一个注册表项HKLM\\SOFTWARE\\Microsoft \\XPS.注意这里Microsoft后面有一个空格,这可以作为主机被感染的特征
在4011de处,用edx寄存器指向的缓冲区内容,来填充注册表下名为Configuration的键值,而具体的缓冲区内容就是4028cc到4028d8的处看到的字符串

Q4这个恶意代码就有系统的特征是什么
A4.恶意代码创建了注册表项: HKLM\\Software’ \\Microsoft \\XPS\\Configuration (注意Microsoft后的空格)。恶意代码还创建了管理服务。当恶意代码将自己复制到Windows 系统目录时,它可能更改文件名为相匹配的服务名。

至此,关于-in参数的分析告一段落
我们来看其他的,直接对mbscmp进行交叉引用
在这里插入图片描述

然后还是类似的分析流程,这里不再展开。总结,可知
-in 实现代码地址:0x402600 行为:安装服务
-re 实现代码地址:0x402900 行为:卸载服务
-c 实现代码地址:0x401070 行为:设置注册表配置键
-cc 实现代码地址:0x401280 行为:打印注册表配置键

Q2这个恶意代码的命令行选项是什么
A2.程序的命令行选项有4个命令选项。-in选项通知恶意代码安装自己;-re选项通知恶意代码删除自己;-c选项通知恶意代码更新配置,包括恶意代码的标识IP地址;-cc选项通知恶意代码在控制台上打印当前的配置。默认情况下,一旦安装,这个恶意代码将成为一个后门程序
接下来我们分析程序的后门功能
从main函数开始,我们看看调用的情况
首先根据sub_401000的返回值,如果返回值为0,往左走,程序终止进程,删除自身;否则往右
在这里插入图片描述

来到了402b0c,调用sub_402360
在这里插入图片描述

跟入sub_402360,其调用了sub_402020
在这里插入图片描述

跟入sub_402020
调用sub_401e60,将返回的字符串开头位置与支持的值列表进行比较
在这里插入图片描述在这里插入图片描述在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

分别是SLEEP,UPLOAD,DOWNLOAD,CMD,NOTHING

Q5.这个恶意代码通过网络命令执行了哪些不同操作?
A5.通过网络恶意代码可以被指示来运行下面5个命令之一: SLEEP、 UPLOAD、DOWNLOAD、CMD或NOTHING。SLEEP 指示恶意代码在给定的时间内不执行任何动作。UPLOAD命令则是让恶意代码从网络上读取一个文件,并且将这个文件写入到本地系统的指定路径下。DOWNLOAD 命令指示恶意代码通过网络发送一个本地文件的内容到远程主机。CMD命令让恶意代码在本地系统中运行一个shell命令。NOTHING 命令是一个空操作命令,它让恶意代码什么也不做。

如果恶意代码碰到这些字符串之一,则调用一个函数来响应这个请求
这里需要注意的是DOWNLOAD,UPLOAD
他们的功能和其名字是相反的,以DOWNLOAD为例
在这里插入图片描述

会调用sub_401870,跟入
在这里插入图片描述

从其关键的函数调用send可知,这其实是读取文件发送到远程追加的功能。与UPLOAD恰恰相反。
其他的命令的实现函数限于篇幅,不再分析

接下来看看网络特征,我们打开IDA的string窗口
双击下图的url处
在这里插入图片描述

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

可以看到其被调用的位置以及网络特征
在这里插入图片描述

回到string窗口
在这里插入图片描述

上图这两处都是在sub_401af0调用的

在这里插入图片描述

这些都可以作为网络特征
Q6.这个恶意代码是否有网络特征?
A6.恶意代码向http://www.practicalmalwareanalysis.com/发出标识信号,对资源发出http/1.0GET请求。

参考:
1.《恶意代码分析实战》

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

恶意代码分析实战3-2

恶意代码分析实战11-1

恶意代码分析实战14-02

恶意代码分析实战11-2

恶意代码分析实战15-3

恶意代码分析实战21-2