Wannacry病毒分析

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函数

至此,分析完毕

 

 

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值