hacktricks/reversing/cryptographic-algorithms/README.md
2023-08-03 19:12:22 +00:00

9.2 KiB
Raw Blame History

密码/压缩算法

密码/压缩算法

☁️ HackTricks 云 ☁️ -🐦 推特 🐦 - 🎙️ Twitch 🎙️ - 🎥 YouTube 🎥

识别算法

如果你遇到了一个使用移位操作、异或操作和其他多种算术操作的代码,很有可能它是一个密码算法的实现。下面将展示一些无需逆向每一步就能识别所使用的算法的方法。

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

代码常量

有时候,通过需要使用特殊且唯一的值来识别算法是非常容易的。

如果你在 Google 中搜索第一个常量,你会得到以下结果:

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

数据信息

如果代码中没有任何重要的常量,它可能是从**.data 部分加载信息**。
你可以访问该数据,将第一个 dword 分组,并像前面的部分一样在 Google 中搜索它:

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

RC4 (对称加密)

特征

它由 3 个主要部分组成:

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

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

初始化阶段/替代盒:注意计数器使用的数字256以及如何在256个字符的每个位置上写入0

混淆阶段:

XOR阶段

AES对称加密

特征

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

SBox常量

Serpent对称加密

特征

  • 很少发现使用它的恶意软件但有一些例子Ursnif
  • 可以根据其长度非常长的函数确定算法是否为Serpent。

识别

在下图中,请注意使用了常量0x9E3779B9(注意,此常量也被其他加密算法如TEATiny Encryption Algorithm使用
还请注意循环的大小132)以及反汇编指令代码示例中的XOR操作的数量

正如之前提到的,可以在任何反编译器中将此代码视为非常长的函数,因为其中没有跳转。反编译后的代码可能如下所示:

因此,可以通过检查魔术数字初始XOR,查看非常长的函数并将其与实现进行比较如左移7位和左旋转22位来识别此算法。

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变换

请注意使用了更多的常量

CRC哈希

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

识别

检查查找表常量

CRC哈希算法如下所示

APLib压缩

特征

  • 无法识别的常量
  • 可以尝试在Python中编写算法并在网上搜索类似的内容

识别

图形非常大:

检查3个比较以识别它

☁️ HackTricks Cloud ☁️ -🐦 Twitter 🐦 - 🎙️ Twitch 🎙️ - 🎥 Youtube 🎥