恶意代码分析实战07-02

Posted Elwood Ying

tags:

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

先peview看看exe程序

注意到这里有两个kernel32.dll,不过仔细看的话,发现其中有一个是假的,名字为kerne132.dll,kernel的l被换成了1
而且出现了lab07-03.dll。看来运行这个exe的时候会加载这个dll
再来看看导入表

函数如createfile,createfilemappingA,MapViewOfFile可知程序会打开一个文件并且映射到内存中。Findfirstfile,filenextfile可知程序会搜索目录,并使用copyfilea来复制它找到的文件。
接下来看看dll
在字符串中看到了

看到了看到了ip地址,以及一些字符串hello,sleep,exec等
看看导入表

有之前分析过的,创建互斥量的函数,说明应该也是确保在当前系统中只运行一个实例
看到其导出表
没有任何导出函数
它不能被另外一个程序导入。不过一个程序还是可以调用loadlibrary来载入没有导出的dll。
接下来使用ida分析dll

在graph overview中可以看到比较复杂
为了简化分析的流程,我们可以先看call

第一个call调用库函数_alloca_probe,在空间中分配栈空间
接着是调用Openmutex,createmutex,用于保证同一时间只有这个恶意代码的一个实例在运行

接下来要建立远程socket,而且要传输和接收数据
我们猜测这是用于与远程机器C&C的
在connect调用的前几行,看到了对inet_addr的调用使用了固定的ip地址127.26.152.13,参数0x50对应10进制80,即80端口。这个端口我们知道通常是web流量
看看是传输的数据是什么

可以看到,buf参数保存了将要通过网络发送的数据,指向buf的指针代表字符串hello
接下来看recv
可以看到栈上的缓冲区buf
push eax
而前面的指令是lea eax,[esp+120ch+buf]
也就是这个位置esp+120ch+buf保存着的就是从远程接收的指令
再来分析程序接下来会做什么

可以看到调用了strncmp,检查前5个字符是不是sleep
之后会test eax,eax会判断eax是否为0,也就是判断返回值是否为0
而我们知道strncmp在相等时返回0
那么,也就是说,如果是通过了strncmp比较,则往左走,调用sleep函数睡眠
如果前五个字符不是0,则往右走
可以看到会检查前4个字符是否为exec

如果是的话,则会往右边走,调用createprocessa
注意到,在调用时有很多参数,关注commandline参数,它可以指出要被创建的进程。
它的内容实际上就是紧跟在exec后面的内容
也就是说比如exec a
则会调用createprocess执行a

执行完毕之后

跟着流程可以看到是在不停地接收指令

接下来分析exe程序

可以看到一开始将argc赋给eax,之后cmp eax,2
argc是main的第一个参数,表示的是参数个数,那么这里cmp指令的作用就是比较参数个数是不是2
如果不是2的话则走右边的线,直接就退出了
接下来mov eax,[esp+54h+argv]
将argv给了eax
将字符串warning…移到esi
之后mov eax,[eax+4]相当于是取argv[1]到eax

接着是循环比较保存在esi,eax的值,如果不一样则跳到一个位置,并从这个函数返回
比较通过后会继续往下走

上图可以看到调用了createfile等函数,以及打开了kernel32.dll,lab07-03.dll
继续往下

看到多次调用sub_401040以及sub_401070
它们在做一些内存操作,直接跳过不再分析
继续往下

可以看到它在打开的两个文件上调用closehandle,所以我们知道这个恶意代码完成了对那些文件的编辑
然后是调用copyfile,复制lab07-03.dll到kernel1.dll
在快结束时看到调用了sub_4011e0
参数为”c:\\”
跟进去

可以看到,这个函数的第一个参数被标记为lpFileName
之后lpFileName作为FindFirstFileA的参数来进行文件查找
也就是说会在c盘进行查找
往下看

调用了stricmp
它的参数是被压到栈上的,往前找push,可以看到内容为.exe和Str1,将两者进行比较,如果比较成功则往下走执行sub_4010a0
也就是说找到了exe程序就则调用sub_4010a0
跟入

可以看到调用createfile,createfilemapping,mapviewoffiel用于将找到的程序映射到内存中
后面调用的isbadreadptr是用于验证指针是否有效

往下走

看到对stricmp的调用
检查字符串值是不是kernel32.dll
之后调用repne scasb,用于扫描字符串,计算字符串长度
rep movsd是用于进行字符串的复制,会将esi的内容覆盖到edi中
其实直接将其理解为strlen,memcpy就可以了
而edi由于mov edi,ebx,相当于我们要去看ebx
而往上走,可以知道ebx是str1
那么我们也就知道了这段的功能,就是在搜索程序里是否有kernel32.dll,如果有则将esi的内容覆盖edi
我们去看看esi内容

按A将其转换

现在可以看其实表示的是伪造的kernel32.dll
这样子我们就知道这个可执行文件会遍历寻找exe文件,再在exe文件周到kernel32.exe,并使用kerne132.dll(假的)来替换它。加上之前分析到的,lab07-03.dll被复制到c:\\windows\\system32目录并命名为kerne132.dll。我们可以知道,这个恶意代码修改可执行文件让他们访问kerne132.dll,而不是真的kernel32.dll

接下来运行后进行分析
我们使用process monitor来进行监控

设置好过滤条件,尝试直接运行

接下来cmd运行,并且传入字符串

稍微卡顿了一会儿,可以看到检测到了很多信息

按照之前的分析,程序会感染c盘所有的exe文件
之前我放置了一个Lab07-01.exe

使用dependency walker看看是否感染成功

可以看到一个伪造的kerne132.dll
以及真的kernel32.dll
之前说到程序会复制Lab07-03.dll到system目录下
我们去看看

可以看到一个是真的,一个是假的
r分析假的dll

注意到假的dll调用了真的kernel32.dll
而且相比之前的lab07-03.dll
多了很多导出函数

其实这些导出函数都是真的kernel32.dll的导出函数重定向得到的,这样一来假的kerne132.dll也可以完全实现真的kernel32.dll的功能
Q1这个程序如何完成持久化驻留,来确保在计算机被重启后它能继续运行
A1.这个程序通过写一个DLL到C:\\Windows\\System32, 并修改系统上每一 一个导入它的.exe文件,来达到持久化驻留
Q2这个恶意代码的两个明显的基于主机特征是什么
A2.这个程序通过硬编码来使用文件名kerne132.dll, 这是一个很好的检测特征(注意数字1的使用而不是字母l)。
Q3这个程序的目的是什么
A3.这个程序的目的是创建一个很难删除的后门,来连接到一个远程主机。这个后门有两个命令:一个用来执行命令,一个用来睡眠。
Q4.一旦这个恶意代码被安装,如何移除?
A4.这个程序很难被删除,是因为它感染系统上的每一个.exe 文件。我们如果在虚拟机中操作的话,最好的办法就是恢复快照。也可以留下这个恶意的kerne132.dll 文件并修改它,来删除恶意的内容。另外,可以复制kernel32.dll, 并将它命名为kerne132.dII, 或者写一个程序来取消所有对PE文件的修改

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

恶意代码分析实战07-01

恶意代码分析实战07-01

恶意代码分析实战18-3

恶意代码分析实战3-2

恶意代码分析实战3-2

恶意代码分析实战9-1