方程式(EQUATION)部分组件中的加密技巧分析

时间 :  2015年02月10日  来源:  安天


      安天分析团队从2月启动“方程式(EQUATION)”分析工作,在形成了第一篇分析报告后,后续整体分析没有取得更多的进展和亮点。基于这种情况,我们首先尝试对部分组件中的加密技巧进行了分析树立,以利后续工作,我们将相关工作进行分享,希望得到业内同仁的批评指点。

DoubleFantasy组件


      DoubleFantasy是用于环境认证的前导模块,其他分析机构认为该组件活跃时间约为2004年至2012年,之后被TripleFantasy替代。DoubleFantasy针对资源、注册表存储和网络通讯中均使用了加密技巧。

      资源加解密算法:DoubleFantasy自带的资源为密文,采用异或算法,密钥有两个,为0x3C(xor 0x3C)和0x7F(xor 0x7F),如图:

 
注册表存储配置和网络通讯加密算法: 

         DoubleFantasy组件中的注册表存储配置信息和网络通讯加密算法均为对称加密算法RC6。组件代码生成一组长度0x44*4的密钥,随后使用该密钥,对一些配置数据和网络通讯进行加密,由于是对称加密算法,加解密方法相同。DoubleFantasy没有预设密钥,保证对不同目标的采用的加密密钥都不相同。

解读:是一种分组加密算法,其由RSA实验室以RC5算法为基础改进提出,并参加了AES的遴选,成为最终入围的5种候选算法之一,但最终被比利时的Rijandael击败。
 
  1. 解密函数参数

      函数共5个参数,其中4个参数 
     
      Decode
     
      {
   
      Lpdata1   ;密文地址 

      Lpdata2   ;解密后明文地址 

      Lenth     ;密文长度 

      Lpkey     ;密钥地址 

      }
  1. 密钥结构分析
     
      密钥长度为:4*49=196(bytes),各部分数据示例如下:

          Sk1            Sk2            Sk3           Sk4

          ……          ……          ……       

          Sk37          Sk38          SK39          SK40

          Sk37          Sk38          SK39          SK40

          Sk41          Sk42          Sk43          Sk44

          Sk45          Sk46          Sk47          Sk48

          Sk49        

        
      其中sk45-48为二级密钥,sk49为修正标志。


      1.解密数据的方法

      2.根据密钥,计算二级密钥(二级密钥长度为16bytes)

      3.将密文前16位与二级密钥进行逐byte进行异或操作。结果为明文。

      4.将计算后的二级密钥按顺序替换密钥中的k45-k48共16个bytes

      5.重新计算下一级密钥。再对后面16个bytes进行解密。

      6.循环直到未解密的密文长度不足16bytes

      7.修正标志为剩余密文byte数。

      8.继续计算下级密钥并更新密钥,逐byte解密。

      9.二级密钥计算方法

      10.二级密钥共16个bytes,4个bytes为一个参数。结构图如下:
           
      R1          R2          R3          R4


      二级密钥计算密码表

          参数名             参数值

             L1                     R2

             L2                     R4

             L3                     R1

             L4                     R3

             L5                     R1

             L6                     R2

             L7                     R4

             L8                     R2

             L9                     R3

             L10                   R1

             L11                   R3

             L12                   R4

             L13                   R2

             L14                   R3

          
      二级密钥计算方法

      1.R2=K1+K46;R4=K2+K48

      2.(L1+L1+1)*L1=M1;(L2+L2+1)*L2=M2

      3.M1环左移5位得到结果M1;M2环左移5位得到结果M2
 
      4.M1和L3进行异或操作;M2和L4进行异或操作

      5.分别取M1和M2的低8位:N1和N2
 
      6.将M1循环左移N2位得到Z1;将M2循环左移N1位得到Z2

      7.Z1+K3写入到L3对应的地址中

      8.Z2+K4写入到L4对应的地址中

      9.步骤2-8循环4次。其中L下标每次加3,K下标每次加2

      10.步骤2-9重复循环5次,L下标不变,K下标依次向后增加。

      11.K43+R1=R1;K44+R3=R3

         该加密算法比较对安全研究人员分析增加了一定困难,由于没有预设的密钥,除非分析人员有完整的数据流,否则无法解密加密的数据。

EquationDrug组件:

      EquationDrug是一个复杂的攻击组件,其是Fanny/Fantasy系列前导验证模块,的一个手续枢纽模块,可以完成相关的信息上传和后续组件下载工作。

资源加解密算法:采用了是异或和移位混合使用的方式。 
     
      下面是将资源中数据获取,并对其解密的一段操作,解密得到多个字符串。


      在EquationDrug的msnadt.exe模块中,我们发现释放可执行程序相关解密操作,所使用的加密方式多为移位、异或操作,下图为主要的解密部分。 


GrayFish组件


      GrayFish组件是方程式攻击组织使用组件中最为复杂的组件之一,其自身依托注册表进行分块存储,借助Bootkit完成无文件载体的加载。其资源、配置中广泛使用了加密技术。

      资源加解密算法:

      1.GrayFish还原为执行体后,其资源节的前4字节为解密密钥

      2.X =0xDD483B8F - 0x6033A96D *密钥

      3.逐字节读取后面的数据与X进行异或

      解密的数据使用RtlCompressBuffer修复即得到明文


 
      GrayFish的资源解密代码

      配置数据解密算法:

      1.密码对照表在偏移0x0042010C处

      2.根据密文的16进制数作为偏移,从密码对照表中读取数据

      3.逐字节读取拼接成明文数据

GrayFish配置字符串解密算法和密码对照表