加密/压缩算法

Reading time: 8 minutes

加密/压缩算法

tip

学习和实践 AWS 黑客技术:HackTricks Training AWS Red Team Expert (ARTE)
学习和实践 GCP 黑客技术:HackTricks Training GCP Red Team Expert (GRTE)

支持 HackTricks

识别算法

如果你在代码中使用了右移和左移、异或以及多个算术操作,那么它很可能是加密算法的实现。这里将展示一些识别所使用算法的方法,而无需逐步反向工程

API 函数

CryptDeriveKey

如果使用了此函数,可以通过检查第二个参数的值来找到使用的算法

在这里查看可能的算法及其分配值的表格:https://docs.microsoft.com/en-us/windows/win32/seccrypto/alg-id

RtlCompressBuffer/RtlDecompressBuffer

压缩和解压缩给定的数据缓冲区。

CryptAcquireContext

来自文档CryptAcquireContext函数用于获取特定加密服务提供程序(CSP)内特定密钥容器的句柄。此返回的句柄用于调用使用所选CSP的CryptoAPI函数。

CryptCreateHash

初始化数据流的哈希。如果使用了此函数,可以通过检查第二个参数的值来找到使用的算法


在这里查看可能的算法及其分配值的表格:https://docs.microsoft.com/en-us/windows/win32/seccrypto/alg-id

代码常量

有时,由于需要使用特殊且唯一的值,识别算法非常简单。

如果你在谷歌中搜索第一个常量,这就是你得到的结果:

因此,你可以假设反编译的函数是sha256计算器
你可以搜索其他常量,可能会得到相同的结果。

数据信息

如果代码没有任何显著的常量,它可能在加载来自.data部分的信息
你可以访问该数据,将第一个dword分组并在谷歌中搜索,就像我们在前面的部分所做的那样:

在这种情况下,如果你搜索0xA56363C6,你会发现它与AES算法的表相关。

RC4 (对称加密)

特征

它由三个主要部分组成:

  • 初始化阶段/:创建一个从0x00到0xFF的值表(总共256字节,0x100)。这个表通常称为替代盒(或SBox)。
  • 打乱阶段:将循环遍历之前创建的表(0x100次迭代的循环),用半随机字节修改每个值。为了创建这些半随机字节,使用RC4密钥。RC4密钥的长度可以在1到256字节之间,但通常建议长度超过5字节。通常,RC4密钥为16字节。
  • 异或阶段:最后,明文或密文与之前创建的值进行异或。加密和解密的函数是相同的。为此,将对创建的256字节进行循环,循环次数根据需要而定。这通常在反编译的代码中通过**%256(模256)**来识别。

note

为了在反汇编/反编译代码中识别RC4,你可以检查两个大小为0x100的循环(使用密钥),然后将输入数据与之前在两个循环中创建的256个值进行异或,可能使用%256(模256)

初始化阶段/替代盒:(注意用作计数器的数字256,以及在256个字符的每个位置写入0的方式)

打乱阶段:

异或阶段:

AES (对称加密)

特征

  • 使用替代盒和查找表
  • 由于使用特定查找表值(常量),可以区分AES注意常量可以存储在二进制中或动态创建。_
  • 加密密钥必须是16的倍数(通常为32B),并且通常使用16B的IV

SBox 常量

Serpent (对称加密)

特征

  • 很少发现某些恶意软件使用它,但有例子(Ursnif)
  • 根据其长度(极长的函数)简单判断算法是否为Serpent

识别

在下图中注意常量0x9E3779B9的使用(注意该常量也被其他加密算法如TEA - Tiny Encryption Algorithm使用)。
还要注意循环的大小132)和反汇编指令中的异或操作数量以及代码示例:

如前所述,这段代码可以在任何反编译器中可视化为非常长的函数,因为其中没有跳转。反编译的代码可能看起来如下:

因此,可以通过检查魔法数字初始异或来识别此算法,看到非常长的函数比较一些指令与长函数的实现(如左移7和左旋转22)。

RSA (非对称加密)

特征

  • 比对称算法更复杂
  • 没有常量!(自定义实现难以确定)
  • KANAL(加密分析器)未能显示RSA的提示,因为它依赖于常量。

通过比较识别

  • 在第11行(左)有一个+7) >> 3,与第35行(右)相同:+7) / 8
  • 第12行(左)检查modulus_len < 0x040,而第36行(右)检查inputLen+11 > modulusLen

MD5 & SHA(哈希)

特征

  • 3个函数:Init、Update、Final
  • 初始化函数相似

识别

Init

你可以通过检查常量来识别它们。注意sha_init有一个MD5没有的常量:

MD5 Transform

注意使用了更多常量

CRC(哈希)

  • 更小且更高效,因为它的功能是查找数据中的意外更改
  • 使用查找表(因此你可以识别常量)

识别

检查查找表常量

CRC哈希算法看起来像:

APLib(压缩)

特征

  • 没有可识别的常量
  • 你可以尝试用python编写算法并在线搜索类似的东西

识别

图表相当大:

检查3个比较以识别它

tip

学习和实践 AWS 黑客技术:HackTricks Training AWS Red Team Expert (ARTE)
学习和实践 GCP 黑客技术:HackTricks Training GCP Red Team Expert (GRTE)

支持 HackTricks