原文:https://blog.malwarebytes.com/threat-analysis/2018/02/encryption-101-shione-ransomware-case-study/

0x00 简介


在本系列的第一篇文章中,我们为读者介绍了与恶意软件有关的一些加密基础概念。如果您还没有读过的话,我们强烈建议先阅读上一篇文章,因为它是理解下面介绍的案例的基础。在本文中,我们将对勒索软件ShiOne中与加密有关的代码进行逐行解读。

本文旨在通过一个实例来帮助读者深入理解勒索软件的加密过程。这里的示例软件为ShiOne,之所以选它,并不是因为它有什么过人之处或采用了什么新颖的技术,恰恰相反,而是因为它相对简单,并且用是用C#编写的,在讲解关键代码的时候会更加容易一些。

0x01 勒索软件常用的加密方式


在前面的文章中,我们曾说过勒索软件采用的加密方式有很多,例如:

  • 加密密钥是在受害计算机上本地生成并发送到C2服务器的。
  • 密钥是预先分发并嵌入勒索软件中的。

对于本文所用的例子来说,它采用的是第二种加密方式。也就是说,加密密钥是脱机生成的,并在发动攻击之前就已经嵌入到恶意软件中了。

当谈论加密密钥是离线生成并提前嵌入的时候,意味着我们讨论的是非对称密钥。接下来您将看到,在这个勒索软件中采用的是RSA和AES加密算法。

AES是一种对称加密算法,这意味着加密和解密过程使用的是同一个密钥,或者,也可以将该密钥视为加密和解密的密码。AES的密钥实际上是动态生成的,并存储在文件本身之中。该勒索软件对文件进行加密的时候,实际上使用的是AES加密算法。

RSA是该恶意软件中的非对称加密组件——完成相应的预生成和嵌入操作。RSA的作用是隐藏用于加密所有文件的AES密钥(密码)。对于RSA的两个密钥来说,只有公钥位于恶意软件中,因为它在这里只是用于执行加密。在勒索软件中,类似这种同时使用对称/非对称加密算法的现象是非常普遍的。

0x02 加密主函数


我们分析的样本是:

408a97ac8fb82398187ffe6d4c5937d7

在初始化和枚举驱动器中的文件的代码(因为这些代码都是相当标准的,所以无需进行讲解)之后,就是调用了crtp(string path)的加密主函数。

这个函数是从主目录枚举循环中进行调用的,也就是说,每找到一个文件的时候,都会调用一次这个主函数。同时,它也是这个程序中唯一会调用加密API或随机数生成器的函数。由此不难想到,它很可能会使用一个唯一的密钥来加密所有文件。

对于上面的代码,有必要进行一些解释。如前所述,主加密密钥是离线生成的,并被作者嵌入到了恶意软件中。实际上,如果这是一种在本地生成主密钥的勒索软件的话,那么加密函数肯定是位于目录搜索循环之前的某个地方调用crpt函数;但是,这里的情况并非如此,所以,我们可以直接跳过该恶意软件的初始化代码。

下面,让我们来仔细看看crtp函数:

加密过程是从调用string text = Program.CreateSalt(32);这一句开始的。

点击收藏 | 0 关注 | 1
  • 动动手指,沙发就是你的了!
登录 后跟帖