前言
背景:本篇样本来自 https://github.com/0range-x/Virus-sample/blob/master/Chapter_9L/Lab09-02.exe
通过解密还原木马的本质
分析
老样子,先看下导入表,还是这两个库,Kernel32
和 WS2_32
看到字符串中出现了陌生的东西,看样子是初始化堆空间分配内存
main函数
找到 main 函数的地址,401128
处
emm,main 函数刚开始是 将一堆字符串 push 入栈,1qaz2wsx3edc
,ocl.exe
,中间有两个 0 中断
ps:
软中断:就是把下面的代码用 int 3 填充,但是显示的还是原来的代码,即在 cpu 内部遇到中断指令 int 3,产生中断
硬中断:是由 CPU 以外的 I/O 设备(即硬件设备)产生的中断
在 od 中来到主函数
接下来传入了另一个地址处,405034
,来到这里看,
存有大小为 4 的字符数组,同时调用 cmd 命令,
接下来,在 401208
处调用 GetModuleFileNameA
函数,获取当前的绝对路径,紧接着调用了 401550
和 4014c0
这两个函数
strrchr
来 ida 中看,其实就是 _strrchr
和 _strcmp
这两个函数
_strrchr:C库函数,返回参数 str (ecx)
所指向的字符串中搜索最后一次出现字符 c(一个无符号字符)的位置
strcmp:字符串比较函数,不多说
在 strrchr
函数处设置断点,看到当前参数,是该程序的路径名,如果strrchr
函数被调用执行的话,就会返回 Lab09-02.exe"
strcmp
则是验证 Lab09-02.exe(当前文件名)
是否为 ocl.exe
,如果相等,eax 为 0,test 指令 设置 0 标志位,跳转到 40124c
处执行,不相等的话,跳转到 4013d6
,看来是直接退出程序
WSAStartup
来到 40124c
处,调用 WSAStartup
函数
ps:为了在应用程序当中调用任何一个 Winsock API 函数,首先第一件事情就是必须通过 WSAStartup 函数完成对 Winsock 服务的初始化,因此需要调用 WSAStartup 函数。
WSASocketA
:Windows 中建立 socket 连接
看到4012BD
处调用了401089
函数
ida跳转到看看,
来到 od 中,设置断点跟踪
ocl.exe
记得上一步 strcmp
函数后,需要修改返回值 即 eax
改为 1,才能进入 40124c
函数,不然直接退出程序了
来到4012BD
处,可以看到传入字符串1qaz2wsx3edc
,
然后调用了 401440
函数,
异或解密
在ida中看了个寂寞,
之后呢,来到 4010e3
处
idiv:有符号除法,其操作数与 div 相同。执行 8 位除法之前,被除数(AX)必须完成符号扩展。余数的符号总是与被除数相同。
movsx:(进行符号扩展并传送)将源操作数内容复制到目的操作数,并把目的操作数符号扩展到 16 位或 32 位。这条指令只用于有符号整数
当没有头绪的时候看下伪代码,似乎是对字符串进行一系列的异或操作,还是一个循环,按理来猜测,应该与加解密有关,我们在做木马的时候,也经常使用异或来混淆
那就来 od 中循环这么多次看看会发生什么
ok fine 看来猜测正确,对字符串解密,加密的字符串 1qax2wsx3edc
是服务端 www.practicalmalwareanalysis.com
接着顺理成章建立 socket 通信
如果成功连接,跳转倒 40137A
处,如果失败,会 sleep 30s
在对 40137A
的调用中看到,调用了 401000
函数,
跳转过来看,很明显,会创建进程
WaitForSingleObject:在多线程的情况下,有时候我们会希望等待某一线程完成了再继续做其他事情,要实现这个目的,可以使用 Windows API 函数 WaitForSingleObject,或者 WaitForMultipleObjects。这两个函数都会等待 Object 被标为有信号(signaled)时才返回的。
很明显,为了建立 socket 通信,会单独创建一个进程来建立反向 shell,同时隐藏了 cmd.exe
命令行
注意到 STARTUPINFO
这个结构被修改
STARTUPINFO 用于指定新进程的主窗口特性的一个结构
可以看到 wShowWindows
被设置为 0,即隐藏 cmd 窗口。StartUpInfo
中的标准流 StdInput/StdError/StdOutput
被设置为套接字,与 cmd.exe
绑定,所以 cmd.exe 被启动后,所有经过套接字的数据都将发送到 cmd.exe
,并且所有输出都将通过套接字发出。
总结
这个木马相比以前的木马,特色主要是首先要重命名为 ocl.exe
才能成功运行,服务端的字符串通过异或进行加密,然后再进行反向 shell 连接。其实逆向加密算法应该是很复杂的步骤,我这里投机取巧,既然它循环解密,我就在 od 里一直循环运行,直到解密成功,否则只能分析内存块,去内存里找加密的字符串。
Peace.
原文始发于微信公众号(海狮安全团队):简单的病毒分析
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论