首页
社区
课程
招聘
WannaCry的分析与学习
发表于: 2020-3-27 23:24 7889

WannaCry的分析与学习

2020-3-27 23:24
7889

本次分析主要涉及到病毒的勒索部分,主要包括如下几点:

压缩文件格式
因为这里的资源是以压缩包的形式存在,所以有必要先了解相关的格式,对之后的代码分析很有帮助
在这里插入图片描述
文件头
在这里插入图片描述
数据核心目录
在这里插入图片描述
数据目录结束标识
在这里插入图片描述
具体的可以查看文章:ZIP文件格式分析
虽然不能够了解全部,但是哪些很重要还是显而易见的!

函数sub_401810(释放资源)概览
在这里插入图片描述

此后程序会获取DLL中的导出函数: StartSchedule,这个函数就是核心的加密函数了。我们可以通过提取出出来的DLL使用IDA进行辅助分析。

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

这个函数会创建一个脚本文件1.xml,执行之后就删除,产生的结果就是创建了名为Microsoft Updata Scheduler一个计划任务,每隔一分钟就会执行一次主程序!
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
函数sub_100010B0创建WannaDecryptor快捷方式分析
通过分析此脚本是VBS脚本
在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

调用过程sub_10004170 ->sub_100040A0
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

如果是硬盘继续加密
在这里插入图片描述

在这里插入图片描述

函数sub_10002270分析
遍历文件
在这里插入图片描述
在这里插入图片描述
什么样的文件会被加密?

执行加密策略
在这里插入图片描述
函数sub_10002990分析
在这里插入图片描述
在这里插入图片描述
通过分析在第一轮加密中所有的后缀是第二种类型此轮都不会加密,会放到第二轮进行加密!

函数sub_10002990分析
在这里插入图片描述

无论是第一轮还是第二轮其实调用的加密函数一样的!
函数sub_10002180核心加密函数分析
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

之后在返回3/4的时候才执行加密,所以我们只关注返回3/4即可
类型为1的:
大小小于400kb,返回1,不执行加密
大小大于200mb,返回3,执行大文件加密策略
介于两者中间的,返回4,执行小文件加密策略
类型为2的:
大小小于400kb,返回1,不执行加密
大小大于200mb,返回3,执行大文件加密策略
介于两者中间的,返回4,执行小文件加密策略
大文件和小文件的加密策略不同的就是,大文件只是将头部的0x1000个字节写入到尾部,同时将头部清零,再然后写入指定的值,并不像小文件加密那样去创建新文件还要使用AES进行加密!

这部分内容是我在看其他分析文章的时候发现他们的样本中资源释放之后都有这样一个程序taskdl.exe,用来删除指定目录下的后缀名为WNCRYT的文件,但是我的资源中并没有而是存在于我的样本中,所以我就顺便分析一下了。
查壳
在这里插入图片描述
VC6.0编写,未加壳
使用LoadPE查看导入表,根据导入函数猜测功能
在这里插入图片描述
猜测可能和文件操作有关,因为导入函数中涉及到文件的删除和文件遍历等API。
具体分析
在这里插入图片描述
关于上述分析中的疑问

sub_401080函数分析
第一部分:获取系统盘temp文件夹路径,非系统盘获取RECYCLE文件夹路径,同时查找后缀名为.WNCRYT的文件
在这里插入图片描述
第二部分:遍历查找所有后缀名为.WNCRYT的文件
在这里插入图片描述
第三部分:通过遍历容器,删除文件,抹除对象元素,之后对容器申请的堆空间进行释放,此函数最终返回的是成功删除的文件个数!
在这里插入图片描述
补充部分:获取temp文件路径和RECYCLE文件路径函数逆向
在这里插入图片描述

加密总结(偷个懒使用参考文章内容,分析一致)

原始RSA私钥:用于解密受害者机器上的随机RSA私钥;

原始RSA公钥:用于加密受害者机器上的随机RSA私钥;

随机RSA私钥:用于解密AES密钥;

随机RSA公钥:用于加密AES密钥;

AES密钥:用于解密受害者机器上的数据。

文件总结:
taskdl.exe,删除临时目录下的所有“.WNCRYT”扩展名的临时文件。
u.wnry,解密程序,释放后名为@WanaDecryptor@.exe
b.wnry勒索图片资源。
t.wnry,解密后得到加密文件主要逻辑代码。
*r.wnry
,勒索Q&A。
其他的文件我不太清除了,但是火绒实验室的分析给出了结果可以参考!

https://bbs.pediy.com/thread-217644.htm
https://bbs.pediy.com/thread-217662.htm
https://bbs.pediy.com/thread-249520.htm

 
 
 
 
<?xml version="1.0" encoding="UTF-16"?><Task version="1.2" xmlns="http://schemas.microsoft.com/windows/2004/02/mit/task"><RegistrationInfo>
<Author>Microsoft Windows</Author>
<Description>This task keeps your Windows up to date with the latest enhancements and security fixes</Description></RegistrationInfo>
<Triggers><TimeTrigger>
  <Repetition><Interval>PT1M</Interval><StopAtDurationEnd>false</StopAtDurationEnd></Repetition>
  <StartBoundary>2001-01-01T00:00:00</StartBoundary>
  <Enabled>true</Enabled>
</TimeTrigger></Triggers>
<Principals><Principal id="Author"><UserId>WIN-0LRR8CGQ4H6\15pb-win7</UserId><LogonType>InteractiveToken</LogonType><RunLevel>LeastPrivilege</RunLevel></Principal></Principals>
<Settings>
  <MultipleInstancesPolicy>IgnoreNew</MultipleInstancesPolicy>
  <DisallowStartIfOnBatteries>false</DisallowStartIfOnBatteries>
  <StopIfGoingOnBatteries>false</StopIfGoingOnBatteries>
  <AllowHardTerminate>false</AllowHardTerminate>
  <StartWhenAvailable>false</StartWhenAvailable>
  <RunOnlyIfNetworkAvailable>false</RunOnlyIfNetworkAvailable>
 <IdleSettings>
  <StopOnIdleEnd>true</StopOnIdleEnd>
  <RestartOnIdle>false</RestartOnIdle>
 </IdleSettings>
  <AllowStartOnDemand>true</AllowStartOnDemand>
  <Enabled>true</Enabled>
  <Hidden>false</Hidden>
  <RunOnlyIfIdle>false</RunOnlyIfIdle>
  <WakeToRun>true</WakeToRun>
  <ExecutionTimeLimit>PT0S</ExecutionTimeLimit>
  <Priority>7</Priority>
</Settings>
<Actions Context="Author">
  <Exec><Command>
    "C:\Users\15pb-win7\Desktop\ÓÀºãÖ®À¶WannaCryÑù±¾[ÃÜÂ룺15pb]\ÓÀºãÖ®À¶WannaCryÑù±¾[ÃÜÂ룺15pb]\Ä£¿é¶þ\8dd63adb68ef053e044a5a2f46e0d2cd.exe"
  </Command><Arguments>/r 0</Arguments></Exec>
</Actions></Task>
第一种类型
".doc"".docx"".xls"".xlsx"".ppt"".pptx"".pst"".ost"".msg"".eml"
".vsd"".vsdx"".123"".wks"".wk1"".txt"".csv"".rtf"".pdf"".dwg"
".jpeg"".jpg""

第二种类型
.docb"".docm"".dot"".dotm"".dotx"".xlsm"".xlsb"".xlw"
".xlt"".xlm"".xlc"".xltx"".xltm"".pptm"".pot"".pps"".ppsm"".ppsx"
".ppam"".potx"".potm"".edb"".hwp"".602"".vdi"".vmdk"".vmx"".gpg"
".aes"".ARC"".PAQ"".tar.bz2"".tbk"".bak"".tar"".tgz"".gz"".7z"".rar"
".zip"".backup"".bmp"".png"".gif"".raw"".cgm"".tif"".tiff"".nef"
".psd"".ai"".m4u"".m3u"".mid"".wma"".flv"".3g2"".mkv"".3gp"
".mp4"".mov"".avi"".asf"".mpeg"".vob"".mpg"".wmv"".fla"".swf"
".wav"".mp3"".sh"".class"".jar"".java"".rb"".asp"".php"".jsp"".brd"
".sch"".dch"".dip"".pl"".vb"".js"".h"".pas"".cpp"".c"".cs"
".suo"".sln"".ldf"".mdf"".ibd"".myi"".myd"".frm"".odb"".dbf"".db"
".mdb"".sql"".sqlitedb"".sqlite3"".asc"".lay6"".lay"".mml"".sxm"".otg"".odg"
".uop"".std"".sxd"".otp"".odp"".wb2"".slk"".dif"".stc"".sxc"".ots"
".ods"".3dm"".max"".3ds"".uot"".stw"".sxw"".ott"".odt"".pem"".p12"
".csr"".crt"".key"".pfx"".der"
WCHAR RootPathName[2] = {0X20,0X00,0X3A,0X00};//其ASCII是(空格+“:”)
经查阅MSDN后了解函数GetDriveTypeA其参数根路径必须加上反斜杠,但是经过实际测试之后
即使不加反斜杠也是没有问题的!
    char szPath[3] = { 0x43,0x3A,0x00 };
    int type = GetDriveTypeA(szPath);
上述测试代码用来获取我电脑C盘的类型,得到的结果是正确的,所以不加就像病毒代码中的一样部件反斜杠来获取盘符类型也是没有问题的。
  • 资源的释放
  • 解密文档为PE文件(病毒的核心加密模块)
  • PE文件的加载
  • 核心加密逻辑
  • 文件的删除
    没有病毒的传播部分,自认为能力有限,火绒实验室对传播有分析,文章链接放在下面,所以还请各位大佬酌情观看!

    基础分析

    基础静态

    PEID查壳

    在这里插入图片描述

    LoadPe查看导入表

    在这里插入图片描述
    在这里插入图片描述
    从对KERNEL32.DLL的引用中可以了解到病毒对操作了资源和文件
    在这里插入图片描述
    从对ADVAPI32.DLL的引用中可以了解病毒使用了加密算法

    ResourceHacker查看资源

    从PEID中可以看到其实资源的比重占据了相当大的一部分以及loadPe中对资源的操作函数调用,所以很自然的就需要查看以下资源。
    在这里插入图片描述
    之后我们可以把它们导出来做初步了解
    在这里插入图片描述

    基础动态

    procexp查看进程树

    这里需要注意的是病毒启动了计划任务,每隔一段时间就会自动运行主程序,紧接着就会自动退出!
    在这里插入图片描述

    火绒剑行为分析

    文件监控

    可以看到病毒用老的文件创建了许多新的文件,文件被加密同时后缀被更改。在这里插入图片描述

    注册表监控

    在这里插入图片描述

    详细分析

    一:主程序概览

    在这里插入图片描述

    二:资源释放

  • 压缩文件格式
    因为这里的资源是以压缩包的形式存在,所以有必要先了解相关的格式,对之后的代码分析很有帮助
    在这里插入图片描述
    文件头
    在这里插入图片描述
    数据核心目录
    在这里插入图片描述
    数据目录结束标识
    在这里插入图片描述
    具体的可以查看文章:ZIP文件格式分析
    虽然不能够了解全部,但是哪些很重要还是显而易见的!

  • 函数sub_401810(释放资源)概览
    在这里插入图片描述

  • 函数sub_408820保存参数)函数分析
    在这里插入图片描述
    函数sub_407B10分析
    在这里插入图片描述
    函数sub_406CC0函数分析
    在这里插入图片描述
  • 函数sub_408840(参数校验)函数分析
    调用过程sub_408840->sub_407C00->sub_407360
    在这里插入图片描述
    在这里插入图片描述
  • 堆使用总结
    这里分析的并不是很细致,所以难免分析不到位,这里只是个大概的情况,还请各位大佬指正补充!
    在这里插入图片描述
  • 函数sub_401210(解密文件)概览
    在这里插入图片描述这里最终要的两个函数就是sub_4027D0(获取index)和函数sub_403A40(解密为PE文件),但是这两个函数都是数据操作,所以我在分析的时候使用的是OD的动态调试,最终的分析结果如下!
    在这里插入图片描述
    绿色部分就是函数sub_4027D0所执行的过程,红色部分就是函数sub_403A40执行过程
    附上sub_403A40函数的简单分析
    在这里插入图片描述
    0x10字节的明文经过对核心加密文件的分析得出应该是AES密钥!
  • 函数sub_401D40PE文件展开)分析
    在这里插入图片描述
    这部分我也是通过OD进行调试的,但是UDD文件在回复虚拟机的时候被我搞丢了,所以这一部分就只能凭空说一下了,IDA的反编译我真的不想再看一眼!
    解密之后的DLL文件我已经提取出来了,之后会放在附件中。
    在这里插入图片描述
    在这里插入图片描述
    PE文件展开:通过镜像大小申请指定加载基址(默认加载基址0x10000000)的内存大小,之后根据区段表中各个区段的RVA进行贴到对应的位置。
    修复IAT:遍历DLL的导入表获取函数的名称,再找到函数所在的DLL,遍历所在DLL的导出表,匹配函数名(序号)从而获取函数所在地址,最后填充到IAT表中
    修改区段的属性:在区段表中最后一个字段描述了区段的属性,可以通过修改此值达到修改区段属性
    调用TLS回调函数:由于此函数没有TLS回调就不会调用
    其实此处还调用了重定位的修复,但是dll是按照0x10000000默认加载基址进行加载的所以程序将重定位部分的内存空间进行了释放!
  • 说明
  • 基础分析
  •          基础静态

  • [招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)

    上传的附件:
    收藏
    免费 4
    支持
    分享
    最新回复 (3)
    雪    币: 43
    活跃值: (1084)
    能力值: ( LV3,RANK:20 )
    在线值:
    发帖
    回帖
    粉丝
    2
    感谢分享
    2020-3-28 00:26
    0
    雪    币: 102
    活跃值: (50)
    能力值: ( LV3,RANK:20 )
    在线值:
    发帖
    回帖
    粉丝
    3
    如此庞大细致的工作量,佩服!
    2020-4-4 10:40
    0
    雪    币: 3126
    活跃值: (3256)
    能力值: ( LV8,RANK:120 )
    在线值:
    发帖
    回帖
    粉丝
    4
    整体不完善且有诸多不足,还得多学习,一起努力吧!
    2020-4-4 11:27
    0
    游客
    登录 | 注册 方可回帖
    返回
    //