一款简单的反向shell恶意样本分析
样本来自《恶意软件分析实战》第九章的的实验二。
静态分析
基本信息
查看样本信息,发现程序没有加壳,使用VC++基编写

编译时间2011/041/30

接着查看字符串,没有发现有用的信息,如下

静态分析
使用ida分析来到入口函数,发现初始化了一堆参数

接着调用GetModuleFileNameA函数获取样本执行的路径,并判断当前样本的名称是否为ocl.exe,如果不是则退出

如果相同则创建socket链接,否则退出。这里进入创建socket链接

在调用gethostbyname函数前,会调用sub_401089函数解密出要获取的name。其中ebp=var_1B0的参数是在初始化的时候就给定了一个字符串,如下

整理后得到1qaz2wsx3edc,参数ebp+var_1F0的值是一个经过加密的数组

这里将数组导出备用,导出方式为

这里导出为C数组即可,如下

经过分析函数sub_401089可知
- 获取key=
1qaz2wsx3edc的长度 slen, - 循环32次,每次获取一个key[index%slen]^(index+data[i])
如下

解密后的字符串为
www.practicalmalwareanalysis.com
接着调用gethostbyname获取主机信息并调用函数sub_401000创建一个进程,其中进程的输入输入控制是连接的socket对象,创建的进程就相当于一个shell,负责和远程进行交互,如下

创建进程完成后,开始循环等待,每隔0x7530运行一次。

动态分析
程序运行后,首先判断运行的程序名称是否为ocl.exe如下

这里需要过掉这个判断,运行到je
00401240 | 74 0A | je lab09-02.40124C
将ZF=0 -->ZF=1之后来到调用解密函数位置对应的参数分别是

需要解密的数组如下

解密后的数据

之后程序会创建一个进程,这个进程负责和远程进行通信。
程序首先初始化了key,判断程序是否为ocl.exe如果是则运行,如果不是则退出。这里选择path掉这个校验,创建一个socket,之后解密出gethostbyname的参数name获取对应的name的host信息,之后创建一个进程,这个进程的输入和输入都是通过创建的socket来通信,这个程序运行之后每隔0x7530运行一次。
总结
这个样本运行要求修改样本名称为ocl.exe才能运行,并且程序是一个反向shell控制程序,通过运行时解密出url并通过gethostbyname获取通信信息。通过设置CreateProcess函数的StartupInfo中的input output error为sockcet对象来实现接收远程的输入。
IOCs
URL
www[.]practicalmalwareanalysis.com
sha256
F153DFACEC09DD69809C3BBF68270A38EE3701F44220C7BF181C14A68C138133
本文分析了一款简单的反向shell恶意样本,涉及静态和动态分析。样本在满足特定条件时启动一个shell,通过解密获取通信URL,利用gethostbyname获取主机信息,创建进程进行远程交互。该样本要求文件名特定,主要用于实现远程控制。
1069

被折叠的 条评论
为什么被折叠?



