1.样本概况
1.1 样本信息
病毒名称:WannaCry
所属家族:Wanna
MD5值:84C82835A5D21BBCF75A61706D8AB549
SHA1值:5FF465AFAABCBF0150D1A3AB2C2E74F3A4426467
CRC32:4022FCAA
病毒行为:
这里描述病毒行为概况,包括清单文件中恶意组件、敏感的权限、加固情况等。
1.2 测试环境及工具
2.1.1 测试环境
Windows 7 32位操作系统
2.1.2 测试工具
查壳工具:PEID
监测工具:火绒剑、PCHunter
调试工具:OD、IDApro
1.3 分析目标
病毒主要行为
病毒传播原理
查杀方法
2.具体行为分析
2.1 主要行为
(这里详细描述分析的步骤以及每一个行为的关键代码以及整体流程图)
将病毒样本拖入火绒剑中,过滤到行为监控以及注册表监控,可以看到病毒在释放PE文件和自启动释放文件,还有一些关于注册表的操作,如图2-1和2-2:
图2-1 病毒的行为监控
图2-2 病毒的注册表监控
病毒将图片、文档、压缩包、exe等所有文件进行加密,必不可少的就是对文件进行读取,如图2-3:
图2-3 病毒的文件监控
对网络进行监控,发现病毒访问了一些IP地址,具体有什么作用,会在代码中进行分析,如图2-4:
图2-4 病毒的网络监控
2.1.1 恶意程序对用户造成的危害
病毒会将图片、文档、压缩包、exe等所有文件进行加密为WNCRY文件格式,使用户不能正常查看自己的信息。
3.恶意代码分析
3.1 恶意代码基础分析
3.1.1 病毒查壳
使用PEID进行查壳,如图2-5病毒并没有加壳,是一个VC 6.0的程序
图3-1 病毒查壳
3.1.2 加密算法
使用PEID的Kyrpto ANALyzer插件扫描病毒程序来识别加密算法,扫描结果如图2-6所示:
图3-2 加密算法
再搜索字符串
图3-3 字符串
由图2-5和2-6可知恶意程序可能用了RSA加密和AES加密,并且用了ZLIB的压缩算法。
3.1.3 查看导入表
图3-4 导入表
根据kernel32中的FindResourceA可以知道恶意程序对资源进行了操作
3.1.4 资源分析
将恶意程序拖入Resource Hacker中
图3-5 资源分析
通过分析资源以及上面知道病毒利用了压缩算法可知这个资源是一个压缩包,将它提取出来。
图3-6 资源提取
提取出来的资源包需要解压密码,这个我们后续分析。
3.2 恶意代码详细分析
3.2.1 主体逻辑
进入main函数,可以看到有如图3-7中的函数组成,自上而下,开始分析。
图3-7 WinMain函数
GetMoudleFileNameA函数获取当前进程的完整路径。
进入sub_401225函数,根据计算机名的ASCII码乘积作为随机数种子和三位随机生成的数字拼接,生成一个字符串
图3-8 生成的字符串
图3-9 sub_401225函数
根据分析,可将sub_401225函数重命名为RandString
接下来分析sub_4010FD函数
图3-10 sub_4010FD函数
sub_4010FD函数很明显,是对注册表进行操作,所以将sub_4010FD函数重命名为SetReg
在sub_401DAB中,对资源进行操作
图3-11 sub_401DAB函数
用od进行动态分析
图3-12 动态分析sub_401DAB
如图3-12所示,恶意程序在走过此函数后释放了一些文件,包括语言包和勒索代码等,从而将sub_401DAB重命名为ReleaseFiles
图3-13 压缩包密码
根据前面提取出来的压缩包可以知道压缩密码就是WNcry@2017
进入sub_401E9E函数
图3-14 sub_401E9E函数
进入ReadFileToMemory函数中
图3-15 ReadFileToMemory函数
ReadFileToMemory函数打开了c.wnry,并将比特币账户写入到c.wnry,所以将 sub_401E9E函数重命名为WriteAccountToCwnry
继续往下分析
图3-16 两次调用
进入sub_401064函数内部,找到函数主体
图3-17 sub_401064函数
从图3-18可以看出第一次传入的命令行参数是attrib +h .
图3-18 sub_401064函数传入的命令行参数
attrib为批处理文件命令
具体解释如下:- 清除属性。
R 只读文件属性。
A 存档文件属性。
S 系统文件属性。
H 隐藏文件属性。
由于attrib +h命令多了一个‘.’,因此第一次调用函数隐藏文件没有成功
第二次调用是icacls . /grant Everyone:F /T /C /Q命令,大概是创建一个Everyone账户并获取所有权限,通过这两次调用可以知道这个函数是执行cmd命令,因此将sub_401064函数重命名为CmdCommand
接下来继续分析sub_40170A函数
图3-19 sub_40170A函数
观察ida反汇编以及用od动态分析,可知sub_40170A函数利用函数指针获取各个api函数的地址,以用来后面的使用。因此将sub_40170A函数重命名为GetApis
进入sub_4012FD函数
图3-20 sub_4012FD函数
sub_4012FD函数中的sub_4017DD函数调用了InitializeCriticalSection初始化临界区对象,sub_4012FD函数的参数为this指针,可以判断这个函数是构造函数。因此将sub_4012FD函数重命名为Constructed
进入sub_401437函数
图3-21 sub_401437函数
图3-22 ImportKey函数
通过图3-21和图3-22可知,sub_401437函数导入秘钥并申请两块大小为0x100000的空间,
因此将sub_401437函数重命名为ImportKeyAndAllocMemory
图3-23 对t.wnry操作
根据上图,接下来sub_4014A6函数将要对t.wnry文件进行操作
图3-24 用010Editor查看t.wnry
看看t.wnry的内容,应该是个加密文件
进入sub_4014A6函数中
图3-25 sub_4014A6函数
根据分析,sub_4014A6函数将t.wnry进行解密,如图3-26,将sub_4014A6函数重命名为DecryptFile
图3-26 t.wnry解密
将内存中的PE文件提取出来,发现这是一个dll文件
继续分析sub_4021BD函数,进入函数内部
图3-27 sub_4021BD函数
sub_4021BD函数很多,我没有具体分析,大概就是申请堆空间,将PE文件在堆空间加载起来。因此将sub_4021BD函数重命名为AllocMemoryAndLoadPE
继续分析sub_402924函数,在这里我们看到了TaskStart
图3-28 sub_4021BD函数
图3-29 dll导出函数
通过图3-28和图3-20可知,TaskStart是dll的导出函数,继续od动态调试,调用过这个函数后,取出了10005AE0这个地址
图3-30 sub_402924执行过后
用lordPE加载dll,查看导出表,发现TaskStart的偏移是5AE0,所以可以判断这个函数是查找TaskStart的地址,因此重命名为GetTaskStartAddress
图3-31 lordPE加载dll
sub_40137A函数很简单,它在内部释放了堆空间和临界区,因此它是一个析构函数,重命名为Destructor
图3-32 函数主逻辑
由于是申请的堆空间执行的dll,所以ida不能继续分析当前程序,可以用ida分析提取出的dll文件
图3-33 病毒勒索部分
4.病毒勒索部分
4.1 代码分析
Dll文件载入ida,查看TaskStart函数
图4-1 TaskStart函数
可以看到TaskStart函数也是很长,所以继续使用ida静态分析和od动态分析
进入第一个函数sub_10004690
图4-2 sub_10004690函数
看到创建了互斥体,那么这么函数作用是防多开,重命名为Create_Mutex
查看sub_10001000函数
图4-3 sub_10001000函数
图4-4 od查看sub_10001000函数
结合分析,sub_10001000函数将c.wnry读到内存,重命名函数为ReadCwnryToMemory
sub_100012D0函数为检查是否是SYSTEM账户,重命名为CheckSYSTEM
图4-5 od查看sub_100012D0函数
sub_10003410函数和前面的一样,也是GetApis
图4-6 GetApis
往下分析
图4-7 未走的分支
进入sub_10003A10函数,发现也是初始化临界区的函数,重命名为InitCriticalSection
sub_10003AC0函数创建了00000000.pky和00000000.eky两个秘钥
图4-8 创建的秘钥
继续分析下面的
图4-9 几个分析过的函数
接下来就到了关键的五个线程函数
图4-10 五个线程函数
线程一函数
图4-11 线程一函数
线程1每隔25秒循环写入数据到00000000.res,包括前面CryptGenRandom生成的随机值,直到线程退出标记为真退出
线程二函数
每隔五秒判断是否存在00000000.pky
线程三函数是最为复杂的函数,放在最后分析
线程四函数
每30秒启动以隐藏方式创建Taskdl.exe进程
图4-12 创建taskdl.exe进程
线程五函数
前面已经出现了这个函数,设置注册表启动项并启动taskse.exe
分析taskdl.exe程序,这个程序的主要作用是文件遍历,调用DeleteFileW删除D:\$RECYCLE中的.WNCRY后缀的文件
图4-13 taskdl.exe
分析taskse.exe程序
图4-14 taskdl主函数
从函数上看,在主函数对命令行参数做了一个判断 如果小于2直接退出,所以直接载入OD 填入附加参数调试进程,分析过后,taskdl应该是提权相关的程序。
最后,分析线程三函数
图4-15 线程三函数
进入函数,首先遍历磁盘,然后看第二层循环中的sub_10005680函数
图4-15 sub_10005680函数
至此,分析完毕