一款简单的反向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