恶意代码名称:997cf4517ee348ea771fd05f489c07fe(MD5)

恶意代码来源:virustotal 恶意代码类型:木马–远控

简单描述:该样本运行时通过创建傀儡进程从资源数据加载名为Nanocore的远控程序在内存中执行,Nanocore可以远程完全控制受害主机,功能包括:监控屏幕、键盘记录、远程文件管理等。

目录

  1. 行为监控
  2. 逆向分析
    1. 一、手动脱壳
    2. 二、Dump傀儡进程
      1. 1、ZwResumeThread设置断点
      2. 2、Dump傀儡进程
      3. 3、修正区段信息
      4. 4、脱壳
    3. 三、分析傀儡进程
    4. 四、资源文件

行为监控

在虚拟机上运行样本(做完快照之后),利用火绒剑对样本行为进行监测,本虚拟机用的是win7_x86,如下图:

文件行为:

​ 1、在C:\Program Files\Common Files\System\目录下释放symsrv.dll

​ 2、把自身拷贝到C:\Program Files\SMTP Monitor\目录下并改名为smtpmon.exe

注册表操作:把C:\Program Files\SMTP Monitor\smtpmon.exe路径写入HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Run\SMTP Monitor达到开机自启。

网络行为:连接域名(191.101.22.13:4110),接受C&C服务器指令。

释放衍生文件:symsrv.dll、smtpmon.exe

进程:创建傀儡进程smtpmon.exe

逆向分析

一、手动脱壳

首先查壳,发现样本采用UPX壳,主流三种查壳工具(PEiD、EXEInfoPE、DetectItEasy)

然后用OllyDbg打开样本,因为样本加壳所以在打开时会询问是否继续分析,选

进行手动脱壳,根据UPX壳的特点,在程序开始时运行pushad开始后,则在程序解压到内存中结束时必然对应popad,以及随后的长跳转指令。所以可以采用ESP定律法或者查找指令序列,在长跳转处下断点,运行程序,当程序断下时再单步运行一步,此时达到程序脱壳后在内存中的位置,如图:

然后利用ollydbgdump插件进行dump保存为.exe文件(不选择重建IAT选项),但是该文件还不能在od中打开,报错(还没有修复IAT表),所以使用Import REC这个软件进行修复(修改OEP,自动查找IAT,获取输入表,最后转储到刚刚dump出的文件)。

最后成功脱壳,能够正常运行,识别出编译器,但好像区段还有些问题,不过没关系以后能运行,可以继续分析,并把脱完壳的程序重命名为2_.exe

二、Dump傀儡进程

通过行为监测,发现样本在运行中创建了傀儡进程后就结束了自己的进程,所以需要在程序创建傀儡进程后(在唤醒进程运行之前),从内存中dump从傀儡进程在单独分析。

首先了解下傀儡进程创建过程:

​ (1) 通过CreateProcess以CREATE_SUSPENDED方式创建一个进程。

​ (2) GetThreadContext获取挂起进程CONTEXT。

​ (3) ZwUnmapViewOfSection卸载挂起进程内存空间数据;

​ (4) VirtualAlloc分配内存空间;

​ (5) WriteProcessMemory将恶意代码写入分配的内存;

​ (6) SetThreadContext设置挂起进程状态;

​ (7) ResumeThread唤醒进程运行

1、ZwResumeThread设置断点

父进程对傀儡进程写入数据并设置线程上下文后会调用ZwResumeThread唤醒线程运行。

2、Dump傀儡进程

当ZwResumeThread断下后,使用PChunter工具, dump傀儡进程,方法:右键–查看–查看进程内存,点击dump保存为exe文件。

3、修正区段信息

LoadPE载入dump后的程序,查看区段信息,修正前

修正后,就可以完美的运行啦!

4、脱壳

查壳发现dump出来的文件,用之前提到的查壳工具发现还是UPX壳,这次我们用工具直接拖

之前用这种方法不成功,该样本运行时首先会通过释放symsrv.dll并动态加载调用Floodfix2函数来解密数据,所以手动脱壳比较准确。

三、分析傀儡进程

傀儡进程的主要功能为从资源数据中加载一个PE文件到内存中并执行,用IDA打开定位加载资源函数:

根据静态分析,用OD调试,设置两个断点,分别在VirtualAlloc和LoadResource,然后F9运行

当停在第一个断点时,观察寄存器EAX中的值,是为加载资源文件申请的内存空间大小

当停在第二个断点时,再运行一步获得LoadResource函数的返回值存入EAX,该值为资源在内存中的首地址,然后首地址+资源的大小=资源文件结束地址,整体通过二进制复制提取出来。

用010editor,粘贴复制的数据,保存为.exe文件,并查壳PEiD发现是C#所编写的名为Nanocore的远控程序

四、资源文件

查壳分析该dump的PE文件:

需要用dnSpy软件对C#程序进行反编译,期初发现该C#程序有加混淆,所以需要用de4dot.exe对C#进行反混淆,然后再用dnSpy打开

经过分析远控程序尝试连接191.101.22.13:4110,但服务器已无法连接,网上查找到对应版本的控制端,修改连接地址,成功上线。

总结:离大佬们的差距还是很大的,慢慢积累吧,一开始分析的时候遇到了很多问题,但最终还是坚持下来了,收获良多,感谢自己。