恶意代码分析实战Lab11


Lab11-01

首先给出这次的几个问题

依然,我们使用strings先对文件进行初步的分析,可以得到以下结果:

很显然,该恶意程序进行了一系列的资源操作,那么我们接下来应该使用Resource Hacker对他的资源节进行分析

显而易见,该程序的资源节中藏着一个PE文件,我们应该将这个PE文件提取出来,并且使用PEID查看它的文件类型

可以看到该文件为一个DLL文件,我们再对他进行strings分析。发现有gina.dll和一系列的WLX前缀函数,可以推测程序功能为恶意gina拦截

接下来我们进行初步的动态分析,使用Process Monitor监视恶意程序操作

观察发现,程序为注册表创建了键值对,并且向当前目录中写入了一份msgina32.dll,该dll即是我们之前提取出来的资源

因此,问题1:程序向电脑释放了一个伪装的ginaDLL;

问题2:程序通过注册表键值设置,来确保对应操作时首先调用伪造的msgina32.dll,从而实现长久化驻留

接下来我们使用IDA工具对恶意代码进行分析,首先分析exe程序,大体观察一下,发现其功能就是我们刚才所分析的

因此,猜测该恶意程序主要功能集成在dll中,对dll进行分析,可以看到DLLMain中先动态的加载真实的MSGina.dll到全局变量 hLibModule中,便于后续的调用。

既然是Gina拦截程序,那么必然会实现Gina原有的所有功能,我们可以查看导出表验证这一点

接下来我们深入查看,分析该Dll文件在Gina操作的基础上插入了怎样的恶意代码,任选一个函数观察

发现其实现通过调用子函数,再跳转到返回值的对应处进行后续操作,那么我们猜测,该子函数的作用便是将Gina中的原本的对应函数实现地址赋值给eax,深入分析子函数

发现确实如此,通过传入的参数不同,选择调用不同的库函数,并且返回对应地址。但是这样的操作并没有恶意代码的执行啊?那么我们遍历一遍所有导出函数的具体实现,发现函数 WlxLoggedOutSAS的实现与别的函数都有所差别

那么我们猜测WlxLoggedOutSAS便是恶意函数,深入分析

发现格式化字符串的调用,那么此处的子函数应该就是具体的打印函数,我们进入到子函数内部

可以看到,一些有用的信息被写入到了msutil32.sys这个伪装的系统文件中,并且我们知道,logout函数的触发条件,同时虚拟机已经被该程序污染过。因此重启虚拟机,观察该文件中写入了哪些信息

img

发现文件中确实写入了我的账号密码信息,由于笔者未给虚拟机设置密码,所以PW选项中为空

至此,该实验的所有问题我们均分析完毕!

Lab11-02

依旧先以任务导向,我们首先来使用strings等基础工具解决前几个简单问题

通过strings,我们可以观察到如下信息,其中有典型的三个邮件客户端以及邮件开头报文,并且使用到了CopyFileA操作,以及在注册表中创建新的键值对。我们猜测,该恶意代码的驻留方式便是通过注册表中指定的伪装DLL文件来截获正常DLL库的调用

接下来还有另一个文件Lab11-02.ini的strings分析,猜测这是一个加密以后的数据

使用PEID来分析DLL的导出函数,发现Installer,明白这是用来运行恶意代码的函数

我们使用Lab3所说的rundll32来进行dll的安装,并且使用ProMon同步监视其文件和注册表操作

注意,由于我们使用的是rundll32.exe来安装代码,因此filter中的进程名应该为rundll32.exe

通过这三个监控片段,可以发现该恶意代码在system32目录下创建了一个spoolvxx32.dll,并且向注册表中写入了AppInit_DLLs的值,同时尝试在system32目录下查询到Lab11-02.ini

所以我们可以得知Lab11-02.ini应该放在system32目录下,同时查看一下注册表中的对应值,笔者猜测指向开始时创建的spoolvxx32.dll

发现正如我们所想,同时,我们来验证一下这个dll文件是否就是我们的Lab11-02.dll,使用WinMD5进行MD5校验,发现两者MD5相同,说明为同一文件

接下来通过IDA对dll文件进行分析,来判断其RootKit技术

我们跳过Lab11-02.ini的判断过程,直接观察恶意代码部分

通过上下文可知,sub_100010B3压入ini文件的内容,我们猜测其为解密函数,在ollydbg中动态调试,观察解密结果

可以看到解密出的字符串是一个邮箱地址,可以推测该程序功能是在你发邮件的时候拷贝一份发往该邮箱

继续IDA分析,分析返回前调用的最后一个函数sub_100014B6

首先要判断获取到的模块名是否为这三个之一,如果均不是,直接退出。否则进入下一个子函数sub_100013BD的调用

记住压栈参数为CurrentProcessID,继续深入,首先加载kernel32库中的OpenThread函数

接下来CreateToolhelp32Snapshot为当前所有线程拍一张快照

遍历所有线程,将当前进程中的所有不是spoolvxx的线程全部挂起,然后返回

那么我们继续分析顶层中的sub_100012A3函数,它的参数如图所示

作用是加载wsock32.dll中的send函数,并且使用我们两个指针参数调用子函数sub_10001203,我们继续深入

深入以后发现,这个函数才是我们最重要的钩子实现部分,现在笔者将针对代码细细分析

首先是前几行代码,v6=a2-(lpAddress+5),实际上是在计算a2也就是我们的恶意代码与钩子跳转处的相对位移(因为jmp xxx本身占据5字节,所以+5)

接下来是为原始send函数的前5字节附上0x40也就是PAGE_EXECUTE_READWRITE,可读写执行权限,便于后续将jmp指令写入

然后是创建一个指针指向我们的send函数头,准备开始构造jmp指令

由于v5是(char*)类型,所以v5[0]-v5[3]中存放的为send函数地址,在第5字节处保存我们覆盖的长度,再将send函数真正的前5字节复制到分配区域准备运行

后面的操作与上面类似,同样是计算跳转的偏移地址,并且写入jmp指令(0E9)

再往后的操作就是恢复原本权限,同时让我们的第三个参数指针指向send函数原头部加跳转链的地址,并使返回值为也指向该内存空间

那么至此,我们的hook构造链便分析完毕了,最后让我们仔细分析一下真正的恶意代码部分

这一部分就很简单了,如果发送的邮件中含有关键词RCPT TO:的话,就将邮件拦截下来,将目的地更换为攻击者邮箱,先进行一次send,最后再次进行一次send到真正收件人邮箱

那么至此,我们的代码分析过程彻底结束

Lab11-03


文章作者: Yssx
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 Yssx !
评论
  目录