《恶意代码分析实战》实验——Labs-13

《恶意代码分析实战》实验——Labs-13

记录《恶意代码分析实战》中的实验,提供相关链接:

Labs-13-01实验

静态分析:

  1. 查壳——无壳
    在这里插入图片描述

  2. 查看输入表——
    Kernel32.dll:加载资源,资源加锁,找到资源,加载库文件,写文件等函数
    WS2_32.dll: 主机解析函数,网络连接启动与关闭函数
    WININET.dll:网络打开文件,URL连接,网络数据读取等函数
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

  3. 发现资源节中隐藏有其他资源,用ResourceHacker进行查看,发现是两个字符串,但是被加密了
    在这里插入图片描述

  4. String分析——
    字符串“Mozilla/4.0”和“http://%s/%s/” 说明恶意程序可能会调用火狐浏览器进行网络操作
    在这里插入图片描述

IDA分析——exe

  1. 整个main函数的逻辑比较简单,先调用函数sub_401300,然后启动Windows Socket服务,再进入一个循环,其中的循环体调用函数sub_4011C9
    在这里插入图片描述
  2. 先进入函数sub_401300进行分析,该程序主要是加载程序中的资源,并且进行加载,将资源的句柄保存在hResData变量中,然后用LockResource函数得到资源的首部指针保存在变量var_10中,并且将其作为参数传递给函数sub_401190

在这里插入图片描述在这里插入图片描述
7. 进入函数sub_401190进行分析,发现此函数为一个计算函数,由于前面发现资源节中的数据被加密了,所以此函数应该是用于解密操作,其解密的方式是与0x3Bh进行异或。
在这里插入图片描述
在这里插入图片描述
8. 因此函数sub_4010300的功能就是加载资源并且对资源进行解密,并将解密后的资源进行返回,main函数得到解密后的数据将其保存在var_19C中
在这里插入图片描述
9. Main函数的循环体中将var_19C作为参数传递给函数sub_4011C9,
在这里插入图片描述
10. 跟入函数sub_4011C9进行分析
  (1) 进行字符串操作,然后调用函数sub_4010B1,传入的参数一个是主机名var_18,l另一个是变量var_30
在这里插入图片描述
  (2) 分析函数sub_4010B1,发现该函数利用一个循环,对主机名进行进行操作和赋值,其中操作的函数为sub_401000。
在这里插入图片描述
在这里插入图片描述

  (3) 进入sub_401000函数后,发现多次访问内存数据byte_4050E8进行数组类型的操作,进入发现该内存byte_4050E8数据是一个字符串,也就是常见的base64编码表。
在这里插入图片描述
在这里插入图片描述
  (4) 因此我们可以确定函数sub_401000就是base64编码函数,那么函数sub_4010B1就是对本地主机名进行一个base64编码的操作了,传入的两个参数一个是用于加密的数据——主机名称var_18,另一个则是用于保存加密后的数据var_30

11. 继续分析sub_4011C9,此函数的参数arg_0(main函数中的var_19C,也就是从资源中解密得到的数据)、加密后的主机名称var_30与字符串“http://%s/%s/”进行拼接,存放在变量szURL中。
在这里插入图片描述
12. 继续往下,用InternetOpenA函数指定了网络连接的代理为szAgent = “Mozilla/4.0”,用InternetOpenUrlA函数向指定URL发送请求,url来自变量szURL,也就是上一步得到的字符串,因此我们知道程序资源中加密的数据应该是受害者主机将要连接的网址。
在这里插入图片描述
13. 向指定网站发送请求后将获取的资源句柄保存在变量hFile中,同时将网络文件加载到Buffer缓冲区中。
在这里插入图片描述
14. 在接受到网络数据后,会对数据的首字符进行判断,如果是字符“o”,则al置1 ,反之置0,最后程序退出,
在这里插入图片描述
15. 整个恶意程序的功能就分析完成,但是程序中资源节的数据我们仅仅知道是一个网址,并不知道其具体信息,前面分析已经知道是与0x3Bh进行异或进行加密的,我们现在对其进行解密,利用WinHex打开exe文件,然后找到指定位置的数据进行二进制修改,得到网址为:www.practicalmalwareanalysis.com
在这里插入图片描述
在这里插入图片描述
16. 到此,整个恶意程序的分析就结束了,对其功能进行总结

  • 加载隐藏在exe资源节中的资源,
  • 对资源进行解密
  • 获取当前主机名称,并且对其进行base64编码
  • 将从资源解密得到的数据和加密后的当前主机名称进行组合得到url
  • 进行url访问,并且将数据加载到内存中

动态分析:

17. 大量PM并添加过滤机制,然后运行程序
18. 分析注册表操作
发现有6次注册表写操作
在这里插入图片描述
分别是 网络连接安全设置和IE浏览器的代理设置——这些操作应该是用于降低网络连接的安全性,便于恶意程序进行网络数据传输。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
19. 文件操作分析,发现并没有写入文件的操作
在这里插入图片描述
20. 网络操作分析,发现向192.0.78.24/25发送http请求
在这里插入图片描述
21. 利用wireshark抓包后,进行分析,发现了网络连接的具体请求
在这里插入图片描述
在这里插入图片描述
22. 发送的网络请求正如我们静态分析的一样

问题

1. 比较恶意代码中的字符串(字符串命令的输出)与动态分析提供的有用信息,基于这些比较,哪些元素可能被加密?
回答:网络的请求的网址和网站的目录被加密
2. 实验IDAPro搜索恶意代码中字符串“xor”,以此来查找潜在的加密,你发现了哪些加密类型?
回答:在004011B8出发现了异或加密
在这里插入图片描述
3. 恶意代码使用什么密钥加密,加密了什么内容?
回答:利用0x3Bh进行异或对网络连接的网址进行了加密,同时还利用base64对请求网站的目录进行了加密。

  1. 使用静态工具FindCrypt2、Krypto ANALyzer(KANAL)以及IDA熵插件识别一些其他类型的加密机制,你发现了什么?
    回答
    (1) 利用Krypto ANALyzer(KANAL)发现了base64的编码表
    在这里插入图片描述

5.  什么类型的加密被恶意代码用来发送部分网络流量?
回答:base64被用来加密GET请求的部分组成
6. Base64编码函数在反汇编的何处?
回答:根据第4问找到编码表的交叉引用即可找到base64的编码函数,在004010B1处
7. 恶意代码发送的Base64加密数据的最大长度是什么?加密了什么内容?
回答:base64加密的数据最大长度是3,加密了主机名称前12个字母
8. 恶意代码中,你是否在Base64加密数据中看到了填充字符(=或者==)?
回答:并没有
9. 这个恶意代码做了什么?
回答:加载隐藏在exe资源节中的资源,

  • 对资源进行解密
  • 获取当前主机名称,并且对其进行base64编码
  • 将从资源解密得到的数据和加密后的当前主机名称进行组合得到url
  • 进行url访问,并且将网络获取到的数据加载到内存中,检测数据后终止程序。


Labs-13-02实验

样本:Lab13-02.exe

静态分析:

1.查壳——无壳
在这里插入图片描述
2. 查看输入表——
KERNEL32.DLL:读写文件、终止进程和加载库文件等函数
USER32.DLL:获取当前桌面窗口、获取系统分辨率、窗体显示区域的宽度和高度、滚动条的宽度和高度等函数
GDI32.DLL:位图相关函数
在这里插入图片描述
3. Strings分析——无特别字符串
在这里插入图片描述
4. 先进行初步的动态分析,然后再进行IDA分析

IDA分析——exe

5. Main函数很简单,仅仅一个循环函数,循环体中调用了两个sleep函数和sub_401851函数
在这里插入图片描述
6. 进入函数sub_401851进行分析,该函数首先调用sub_401070函数,其中传入了两个函数一个是字节大小,另一个是参数hMem.
在这里插入图片描述
(1) 进入函数sub_401070,该函数调用了大量的位图信息函数,其中GetDesktopWindow用于获取当前桌面句柄和BitBlt用于对获取到的桌面信息进行位图转换,因此可以知道sub_401070函数是用于对受害者桌面进行截图并转换为位图信息保存到hMem参数中。
在这里插入图片描述
在这里插入图片描述
(2) 继续往下,调用了函数sub_40181F,并且将前面获取的屏幕截图的位图信息作为参数传入,跟入该函数进行分析;该函数的功能又集中在sub_401739中,其中的参数arg_4为字节大小,arg_0为传入位图的信息
在这里插入图片描述
(3) 再跟入sub_401739,该函数先调用sub_4012DD,然后进行了一些了运算,猜测sub_401739是一个加密/解密函数,对获取的平截图位图信息进行加密。
在这里插入图片描述
(4) 其中的sub_4012DD也是一个计算函数,它调用的sub_40128D同样是一个计算函数
在这里插入图片描述
在这里插入图片描述
7. 可以看出恶意程序的整个加密过程是非常复杂的,想要单纯的分析处加密算法是非常困难和耗时的,我们暂且先搁置加密算法分析。
8. 结合前面的分析,我们对函数sub_401070和sub_40181F进行注释,回到函数sub_401851继续往下分析
在这里插入图片描述
9. 发现接下来调用GetTickCount函数获取一个时间记录数,然后与字符串“temp%08x”拼接后保存到变量FileName中,然后作为参数与前面加密后的屏幕截图位图信息hMem和数据大小一并传递给函数sub_401000
在这里插入图片描述
10. 跟入函数sub_401000分析
(1) 该函数会先在恶意程序同目录下创建一个文件,文件名由时间戳和字符串“temp%08x”拼接得到
在这里插入图片描述
(2) 然后向该文件写入数据,而数据的内容就是传入的参数中加密后的屏幕截图位图信息
在这里插入图片描述
11. 因此整个函数sub_401851的功能分析就结束了,由于整个恶意程序以此函数为循环体进行循环,所以整个恶意程序的功能也分析完成,现在进行恶意程序的功能总结:

  • 获取受害者用户的桌面截图
  • 对桌面的截图进行加密
  • 在恶意程序同目录下创建文件
  • 向文件中写入加密后的截图信息

动态分析

12. 打开PM和PE进行监控,运行程序
13. 分析注册表操作——无特殊注册表操作
在这里插入图片描述
14. 分析文件操作,利用Tools>>File Summary进行汇总分析,发现两次文件写入
在这里插入图片描述
15. 进行文件写入事件分析,发现在程序同目录下创建了两个文件,并且对向其中写入了数据
在这里插入图片描述
在这里插入图片描述

问题

  1. 使用动态分析技术,确定恶意代码创建了什么?
    回答:在恶意程序的同目录下创建了未知的格式文件.
  2. 使用静态分析技术,例如xor指令搜素,FindCrypt2, Krypto ANALyzer(KANAL)以及IDA熵插件,查找潜在的加密,你发现了什么?
    回答:不能发现明显的加密算法,搜索xor能够发现几处利用xor进行数据计算的地方
  3. 基于问题1的回答,哪些导入函数将是寻找加密函数比较好的一个证据?
    回答:由于会创建文件,那么CreateFile函数和WriteFile函数可以作为较好的一个入口点。
  4. 加密函数在反汇编的何处?
    回答:经过前面的分析,可以知道加密函数为sub_40181F。
  5. 从加密函数追溯原始的加密内容,原始加密内容是什么?
    回答:原始的加密内容是对受害者桌面的截图位图信息。
  6. 你是否能够找到加密算法?如果没有,你如何解密这些内容?
    回答:能够找到加密算法,但是并不知道解密算法。
  7. 使用解密工具,你能够回复加密文件中的一个文件到原始文件?
    回答:尝试用加密函数对加密后的函数进行再次计算
    (1) 利用OD打开恶意程序,在加密函数sub_0040181F处下断点
    在这里插入图片描述
    (2) 此时堆栈的栈顶就是需要被加密的数据在内存中的首地址,右键>>follow in dump
    在这里插入图片描述
    (3) 此时内存搜索窗口会显示被加密数据在内存的地址,我们需要将次内存中的数据进行替换,替换为已经加密过的数据,让已经加密后的数据再次被加密计算。
    在这里插入图片描述
    (4) 用winHEX打开其中一个已经加密后的文件,并且将数据进行复制
    在这里插入图片描述
    (5) 在内存搜索窗口中,选中数据缓冲区的第一个字节数据,然后移动右边的滑块,直接拉到缓冲区的最后,按住shift键在选中最后一个字节的数据,这样就选中了缓冲区的所有数据了。
    在这里插入图片描述
    (6) 在选中的数据中右键>>二进制>>二进制粘贴
    在这里插入图片描述
    (7) 在OD中继续运行程序,得到新创建的文件,将其后缀改名为bmp
    在这里插入图片描述
    (8) 得到还原后的数据,的确是屏幕的截图。
    在这里插入图片描述
    (9) 其实,在不能知道加密数据之前,我们同样可以在加密函数处下断点,找到缓冲区的数据,然后将它们提取出来,利用winHex进行复制另存到一个文件中,然后再与加密后的数据进行对比。

Labs-13-03实验

样本:Lab12-03.exe

静态分析:

  1. 查壳——无壳
    在这里插入图片描述
  2. 查看输入表——
    Kernel.dll:读写文件,创建进程和线程,加载库文件等函数
    User32.dll:字符串打印函数
    WS2_32.dll:网络连接,域名解析,等网络操作函数
  3. Strings分析——
    出现base64常见的编码表,说明程序可能会用到base64编码
    在这里插入图片描述
    出现字符串“cmd”和“dir”,猜测程序可能会启动cmd执行命令
    在这里插入图片描述
    出现网站字符串,猜测恶意程序可能连接C&C,同时出现“key”相关的字符串,猜测程序中可能存在加密。
    在这里插入图片描述
  4. 先进行简单的动态分析,再利用IDA进行详细的静态分析

IDA分析——exe

  1. Main函数首先调用函数sub_401AC2,并且传入四个参数,两个是0x10h,另外两个参数,一个是缓冲区unk_413374,另一个是字符串“ijklmnopqrstuvwx”;另外,ecx指向缓冲区unk_412EF8,然后初始化Windows Scokts 组件
    在这里插入图片描述
  2. 进入函数sub_401AC2,发现该函数非常复杂,涉及大量的数据运算操作,猜测此函数为一个加密函数,
    在这里插入图片描述
    (1) 其中一开始就将ecx的值赋值给var_60;说明此变量在后续的逻辑中可能会用到,我们这块内存数据进行跟踪,发现四处交叉引用。
    在这里插入图片描述
    在这里插入图片描述
    (2) 对这些交叉引用进行跟踪,发现仅有一处实际进行了调用,也就是函数sub_40352D,跟进该函数,发现是一个复杂的计算函数,推测它也是一个加密函数。
    在这里插入图片描述
  3. 对于前面这个复杂的加密函数,我们先不进行分析,先继续往下,发现调用函数WSAStartup进行套字节初始化,
    在这里插入图片描述
  4. 继续往下发现网络链接的相关操作,初始化socket编程接口,然后获取“www.practicalmalwareanalysisi.com”的IP地址,并且与该站点的服务器创建连接,
    在这里插入图片描述
  5. 如果成功地与站点建立连接,那么调用函数sub_4015B7进行下一步操作,其中输入的参数为网络连接的套接字.
    在这里插入图片描述
  6. 进入函数sub_4015B7进行分析,该函数先创建两个管道进行进程内通信,然后将本进程的句柄复制
    在这里插入图片描述
  7. 接下来创建一个结构体StartupInfo,并且该结构体的部分元素将从管道中获取,同时将部分元素输出到管道中;然后将结构体的信息作为参数创建一个cmd的进程。
    在这里插入图片描述
    那么此时的管道结构应该是
    在这里插入图片描述
  8. 继续往下,会创建一个线程,线程地址是StartAddress,并且将套接字中的数据作为参数传入,同时在此处对另一个管道的写句柄进行了操作,这里基本上可以推测出是套接字数据写入到另一个管道中,那么两个管道的通信模型如下(这里有一个疑问,就是没有找到对管道写句柄的直接操作代码,有点奇怪 (⊙ˍ⊙)?)
    在这里插入图片描述
    在这里插入图片描述
    (1) 进入线程地址StartAddress进行分析,该地址的函数会从套接字中读取数据,并保存到缓冲区Buffer中
    在这里插入图片描述
    (2) 然后调用函数sub_401082,并将Buffer中的数据和长度和参数Var_C14传入其中,进入函数sub_401082分析,该程序内部涉及很多的计算操作,可以判断该函数也是一个加密函数,Var_C14应该是用于保存加密后的数据。
    在这里插入图片描述
    (3) 继续往下,调用函数writefile将加密后的数据写入了套接字
    在这里插入图片描述
  9. 继续往下,发现又会创建另一个线程,该进程的参数从管道中得到,线程的起始地址是sub_40132B,而该函数的参数是从管道中读取的
    在这里插入图片描述
    (1) 进入sub_40132B进行分析,发现该函数的逻辑结构和前面创建线程(StartAddress)非常相似,同样是对套接字的数据进行操作,
    在这里插入图片描述
  10. 那么整个两个管道的通信模型如下:
    在这里插入图片描述
  11. 因此,可以得知函数sub_4015B7是一个远控插件,用于远程命令接受和执行,其中利用管道实现cmd和socket之间进行通信,其中进行了多次加密,先在IDA中搜索xor操作的代码处,因为加密算法普遍采用xor进行计算,发现了6个函数中使用的xor进行计算,分别是:sub_401AC2,sub_40223A,sub_4027ED,sub_402DA8,sub_403166,sub_403990。
    在这里插入图片描述
  12. 再用IDA来进行加密模块的识别,发现了8处AES算法的实现。
    在这里插入图片描述
    在这里插入图片描述
  13. 其中前四个是加密模块,在sub_40223A和sub_402DA8被调用
    在这里插入图片描述
  14. 另外四个是解密模块,在sub_403166和sub_4027ED中被调用
    在这里插入图片描述
  15. 前面找到的xor的操作有六处,sub_401AC2,sub_40223A,sub_4027ED,sub_402DA8,sub_403166,sub_403990,再结合上面的AES加密的交叉引用,可以判定sub_40223A和sub_402DA8函数是AES加密相关的基本函数,sub_40352D函数就是AES加密的函数;sub_403166和sub_4027ED函数是AES解密相关的基本函数。
  16. 现在还剩sub_401AC2sub_403990,先看看sub_401AC2,此函数在main函数中被调用,在步骤6中已经分析过,此函数会对缓冲区unk_412EF8中的数据进行修改,然后缓冲区的数据又被函数sub_40352D利用,前面分析得到sub_40352D就是AES加密函数,那么缓冲区unk_412EF8保存的中极有可能是AES加密的中间向量;再结合sub_401AC2的参数字符串"ijklmnopqrstuvwx"和该函数内部的字符串"Empty key",“Incorrect key length”,"Incorrect block length"可以推测出sub_401AC2是一个AES加密初始化函数,"ijklmnopqrstuvwx"应该就是AES加密的密钥。
    在这里插入图片描述在这里插入图片描述
  17. 现在就剩函数sub_403990,查看他的交叉引用,发现它也被函数sub_40352D调用,说明它也可能是AES加密的某个模块。
    在这里插入图片描述
  18. 到此,AES加密的模块已经全部分析完成,前面分析得到sub_4015B7是一个远控插件,管道数据传输模型应该变为:
    在这里插入图片描述
  19. 解密函数是sub_401082,进入函数进行分析,发现调用函数sub_40103F
    在这里插入图片描述
  20. 继续往下跟,发现标准的base64加密模式和字符串,所以解密函数就是一个base64加密函数。
    在这里插入图片描述
    在这里插入图片描述
  21. 管道数据传输模型应该变为:
    在这里插入图片描述
  22. 到此,整个恶意软件的分析就结束了,过程比较绕,现在进行总结
    1) AES初始化
    2)恶意程序连接C&C
    3)恶意程序运行远控插件/函数 sub_4015B7
    4)远控插件一方面从C&C获取信息,该信息应该是被base64加密过,远控插件对socket内容进行base64进行解密,然后将数据传递给cmd,利用cmd执行任意操作;cmd的执行返回结果被AES加密,然后通过socket发送回C&C。

动态分析

  1. 打开PM和PE,运行程序
  2. 分析注册表操作——无特殊的注册表操作
    在这里插入图片描述
  3. 分析文件操作——
    发现恶意程序会在恶意程序目录下尝试打开多个dll文件,但是均为成功,由于测试环境未进行网络连接,猜测这些dll可能是从C&C下载。
    在这里插入图片描述
    在这里插入图片描述

问题

  1. 比较恶意代码的输出字符串和动态分析提供的信息,通过这些比较,你发现哪些元素可能被加密?
    回答:出现了域名“www.practicalmalwareanalysisi.com”,网络传输的流量可能被加密.
  2. 使用静态分析搜索字符串xor来查找潜在的加密,通过这种方法,你会发现什么类型的加密?
    回答:字符串搜索发现了base64加密,xor搜索发现了多个加密函数,但是并不能识别其类型。
  3. 使用静态工具,如FindCrypt2, Krypto ANALyzer(KANAL)以及IDA熵插件识别一些其他类型的加密机制。发现结果与搜索字符XOR结果比较如何?
    回答:使用插件发现了AES加密和base64加密
  4. 恶意代码使用了哪两种加密技术?
    回答:使用了AES加密和base64加密技术
  5. 对于每一种加密技术,它们的密钥是什么?
    回答:AES加密的密钥是"ijklmnopqrstuvwx",base64编码表是 DEFGHIJKLMNOPQRSTUVWXYZABcdefghijklmnopqrstuvwxyzab0123456789+/
  6. 对于加密算法,他的密钥足够可靠吗?另外你必须知道什么?
    回答:密钥以明文保存,不可靠;还需要确定加密内容和加密函数间的联系
  7. 恶意代码做了什么?
    回答:恶意代码的功能
    (1) AES初始化
    (2) 恶意程序连接C&C
    (3) 恶意程序运行远控插件/函数 sub_4015B7
    (4) 远控插件一方面从C&C获取信息,该信息应该是被base64加密过,远控插件对socket内容进行base64进行解密,然后将数据传递给cmd,利用cmd执行任意操作;cmd的执行返回结果被AES加密,然后通过socket发送回C&C。
  8. 后遭代码来解密动态分析过程中生成的一些内容,解密后的内容是什么?
    回答:base64解密的内容是远控cmd命令,AES加密的内容是cmd命令执行的结果。

猜你喜欢

转载自blog.csdn.net/weixin_39561364/article/details/115917032
今日推荐