一个邮件钓鱼木马的分析 (一)


已发表于本人专栏:  http://www.freebuf.com/column/142406.html


最近收到一个钓鱼木马邮件,内容形式如下:

 一个邮件钓鱼木马的分析 (一)_第1张图片

邮件里有个链接,当点开链接后会下载一个doc文档,打开文档会发现有宏代码

 一个邮件钓鱼木马的分析 (一)_第2张图片

经过一些列解密后悔执行shell执行宏命令,打印出这个信息出来后发现,原来执行了powershell命令

 一个邮件钓鱼木马的分析 (一)_第3张图片

是从网络url中下载一些文件并且 StartProcess,看来这才是真正的木马,下载的是一个exe,名字是随机的四个字符的exe名字。

 一个邮件钓鱼木马的分析 (一)_第4张图片

下面就开始分析这个木马,用ollydbg加载木马,在Winmain函数入口点下断点:

 一个邮件钓鱼木马的分析 (一)_第5张图片

F9飞一次,停在了入口,慢慢 F8单步,木马直接到了0300149C的地址

 一个邮件钓鱼木马的分析 (一)_第6张图片

F7继续进入函数:

进入函数不久木马一直两个代码间循环,无法继续往下走,

(1) 循环起止1.

 一个邮件钓鱼木马的分析 (一)_第7张图片

(2) 循环往上跳

 一个邮件钓鱼木马的分析 (一)_第8张图片

当我们F9的时候一直不能跳出循环,我们通过IDA查看发现他做了一个时间判断故意为了防止被分析做了一个时间开关,这个时间有点太大了。

 一个邮件钓鱼木马的分析 (一)_第9张图片

我们直接修改EIP到循环外的地址,跳过这个循环。

 一个邮件钓鱼木马的分析 (一)_第10张图片

继续往下走。

 一个邮件钓鱼木马的分析 (一)_第11张图片

下面有Call VirtualProtect,而这个VirtualProtect把刚才分配的地址改写成PAGE_EXECUTE_READWRITE的属性,也就是变成一个可读写可执行的代码页。

 一个邮件钓鱼木马的分析 (一)_第12张图片

下面就到了木马对内置的加密代码的解密了,可以明显看到原始数据被加密了。

 一个邮件钓鱼木马的分析 (一)_第13张图片

解密完后我们可以看到内存地址内容了,

 一个邮件钓鱼木马的分析 (一)_第14张图片

到此这个函数就执行完毕,返回到入口函数位置后,下面有个cal [3011744] 实际上是前面函数内解密分配的shellcode函数 。

 一个邮件钓鱼木马的分析 (一)_第15张图片

实际上是call 001AA618,进入函数

 一个邮件钓鱼木马的分析 (一)_第16张图片

再次进入就进入真正的函数位置了

 一个邮件钓鱼木马的分析 (一)_第17张图片

很明显字符串 75 73 65 72 33 32用字节码写出来,作者做了一些免杀处理。

在shellcode遇到第一个函数这个函数call 001AA008,函数的功能是查找木马的导入表找到LoadLibraryA函数和GetProcAddress这两个函数地址

 一个邮件钓鱼木马的分析 (一)_第18张图片

 一个邮件钓鱼木马的分析 (一)_第19张图片

接下来就是通过LoadLibrary GetProcAddress函数动态获取一些API的地址,

 一个邮件钓鱼木马的分析 (一)_第20张图片

一个邮件钓鱼木马的分析 (一)_第21张图片

 

一共要获取几十个函数的地址,这块我们跳过去,F9一路飞到地址001AB4EF

 一个邮件钓鱼木马的分析 (一)_第22张图片

这个函数直接调用函数下面的地址,继续 F8单步到001AB50F

 一个邮件钓鱼木马的分析 (一)_第23张图片

继续F7进入001AB50F函数

 一个邮件钓鱼木马的分析 (一)_第24张图片

在这里他会判断木马目录下有没有apfHQ文件,所以我们事先需要生成一个apfHQ文件在目录下,空文件也行,这个过程完毕后就进入了01AA408函数。

 一个邮件钓鱼木马的分析 (一)_第25张图片

 一个邮件钓鱼木马的分析 (一)_第26张图片

继续往1AA408函数内部F7,会经过一些列的RegisterClassEx, CreateWinodwsGetMssage等窗口函数后就进入了1AA108函数

 一个邮件钓鱼木马的分析 (一)_第27张图片

继续F7进入1AA108函数,在进入函数不久,木马会去取一个内存数据,并且判断4550 “PE”这个标志位

 一个邮件钓鱼木马的分析 (一)_第28张图片

接下来调用 GetStartUpInfo,取得当前进程的启动信息

 一个邮件钓鱼木马的分析 (一)_第29张图片

然后接续获得当前进程的命令行参数

 一个邮件钓鱼木马的分析 (一)_第30张图片

然后调用CreateProcess 来把自己作为子进程创建起来,而且创建标志位是

CREATE_SUSPENDED

0×00000004

是以悬挂进程的方式创建子进程

 一个邮件钓鱼木马的分析 (一)_第31张图片

然后继续通过GetThreadContext函数获得子进程的线程上下文

 一个邮件钓鱼木马的分析 (一)_第32张图片

然后在子进程的0×400000的地址远程分配一个大小0xC00大小的内存,内存属性0×40,即读写可执行的属性内存PAGE_EXECUTE_READWRITE  0×40

 一个邮件钓鱼木马的分析 (一)_第33张图片

接下来木马就会使用ZwWriteVirtualMemory函数往子进程的0×400000地址写入大小0×400的数据,通过查看写入的数据发现是个PE

 一个邮件钓鱼木马的分析 (一)_第34张图片

下面就是PE头数据

 一个邮件钓鱼木马的分析 (一)_第35张图片

然后木马会解析这个内存里的PE文件的各个节.text .data .rdata 等等节段,通过ZwWriteVirtualMemory函数分别往子进程的相应内存里远程写入数据。

 一个邮件钓鱼木马的分析 (一)_第36张图片

分别写完数据后,然后改写子进程PE加载器的子进程的执行加载的首地址为0×400000

 一个邮件钓鱼木马的分析 (一)_第37张图片

然后使用SetThreadContext设置子进程的当前线程EIP 指向0x408FE5

 一个邮件钓鱼木马的分析 (一)_第38张图片

最后调用ResumeThread函数恢复子进程的线程继续执行

 一个邮件钓鱼木马的分析 (一)_第39张图片

                    最后父进程退出,子进程开始干一些真正的盗取行为,到此我们可以知道木马是通过创建子自身子进程通过GetThreadContext、ZwWriteVirtualMemory、SetThreadContext、ResumeThread,来实现hook方法达到隐藏真实pe的目的来增加分析人员的分析难度,他的真实PE文件加密存贮在数据段中解密后如下:

一个邮件钓鱼木马的分析 (一)_第40张图片

          现在的木马的隐蔽性越来越深,也经常使用多进程交互,真正的执行逻辑可能已经变换的找不到来源,而过去常用的进程关系行为越来越难以检测了,这就要求安全人员更加深入地研究。


你可能感兴趣的:(逆向,汇编)