# 密码/压缩算法 ## 密码/压缩算法 {% hint style="success" %} 学习并练习AWS黑客技术:[**HackTricks培训AWS红队专家(ARTE)**](https://training.hacktricks.xyz/courses/arte)\ 学习并练习GCP黑客技术:[**HackTricks培训GCP红队专家(GRTE)**](https://training.hacktricks.xyz/courses/grte)
支持HackTricks * 查看[**订阅计划**](https://github.com/sponsors/carlospolop)! * **加入** 💬 [**Discord群**](https://discord.gg/hRep4RUj7f) 或 [**电报群**](https://t.me/peass) 或 **关注**我们的**Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**。** * 通过向[**HackTricks**](https://github.com/carlospolop/hacktricks)和[**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github仓库提交PR来分享黑客技巧。
{% endhint %} ## 识别算法 如果你在代码中**使用移位、异或和多种算术运算**,很可能是**实现了一个密码算法**。这里将展示一些方法来**识别所使用的算法,而无需逆向每一步**。 ### API函数 **CryptDeriveKey** 如果使用了这个函数,可以通过检查第二个参数的值来找到**正在使用的算法**: ![](<../../.gitbook/assets/image (156).png>) 在这里查看可能算法及其分配的值的表格:[https://docs.microsoft.com/en-us/windows/win32/seccrypto/alg-id](https://docs.microsoft.com/en-us/windows/win32/seccrypto/alg-id) **RtlCompressBuffer/RtlDecompressBuffer** 压缩和解压给定的数据缓冲区。 **CryptAcquireContext** 根据[文档](https://learn.microsoft.com/en-us/windows/win32/api/wincrypt/nf-wincrypt-cryptacquirecontexta):**CryptAcquireContext**函数用于获取特定加密服务提供商(CSP)中特定密钥容器的句柄。**返回的句柄用于调用使用所选CSP的CryptoAPI函数**。 **CryptCreateHash** 启动对数据流的哈希处理。如果使用了这个函数,可以通过检查第二个参数的值来找到**正在使用的算法**: ![](<../../.gitbook/assets/image (549).png>) \ 在这里查看可能算法及其分配的值的表格:[https://docs.microsoft.com/en-us/windows/win32/seccrypto/alg-id](https://docs.microsoft.com/en-us/windows/win32/seccrypto/alg-id) ### 代码常量 有时候很容易识别一个算法,因为它需要使用一个特殊且独特的值。 ![](<../../.gitbook/assets/image (833).png>) 如果你在Google中搜索第一个常量,你会得到以下结果: ![](<../../.gitbook/assets/image (529).png>) 因此,你可以假设反编译的函数是一个**sha256计算器**。\ 你可以搜索任何其他常量,你可能会得到(可能)相同的结果。 ### 数据信息 如果代码没有任何重要的常量,它可能是**从.data部分加载信息**。\ 你可以访问这些数据,**将第一个双字分组**,并像前面的部分一样在Google中搜索: ![](<../../.gitbook/assets/image (531).png>) 在这种情况下,如果你搜索**0xA56363C6**,你会发现它与**AES算法的表**有关。 ## RC4 **(对称加密)** ### 特征 它由3个主要部分组成: * **初始化阶段/**:创建一个**值表从0x00到0xFF**(总共256字节,0x100)。这个表通常称为**替代盒**(或SBox)。 * **混淆阶段**:将**循环遍历**之前创建的表(再次循环0x100次)并使用**半随机**字节修改每个值。为了创建这些半随机字节,RC4使用**密钥**。RC4的**密钥**可以是**1到256字节的长度**,但通常建议长度超过5字节。通常,RC4密钥长度为16字节。 * **XOR阶段**:最后,明文或密文与之前创建的值**进行XOR运算**。加密和解密的函数是相同的。为此,将**循环遍历创建的256字节**,直到必要次数。在反编译的代码中,通常会被识别为**%256(模256)**。 {% hint style="info" %} **为了在反汇编/反编译的代码中识别RC4,你可以检查大小为0x100的2个循环(使用密钥),然后将输入数据与在2个循环中之前创建的256个值进行XOR运算,可能使用%256(模256)** {% endhint %} ### **初始化阶段/替代盒:**(注意计数器使用的数字256以及如何在256个字符的每个位置写入0) ![](<../../.gitbook/assets/image (584).png>) ### **混淆阶段:** ![](<../../.gitbook/assets/image (835).png>) ### **XOR阶段:** ![](<../../.gitbook/assets/image (904).png>) ## **AES(对称加密)** ### **特征** * 使用**替代盒和查找表** * 可以**通过特定查找表值**(常量)来**区分AES**。_注意**常量**可以**存储**在二进制文件中**或动态创建**。_ * **加密密钥**必须是**16的倍数**(通常为32字节),通常使用16字节的**IV**。 ### SBox常量 ![](<../../.gitbook/assets/image (208).png>) ## Serpent **(对称加密)** ### 特征 * 很少发现一些恶意软件使用它,但有例外(Ursnif) * 通过长度(非常长的函数)很容易确定算法是否为Serpent。 ### 识别 在下图中注意常量**0x9E3779B9**的使用(注意这个常量也被其他加密算法如**TEA** - Tiny Encryption Algorithm使用)。\ 还要注意**循环的大小**(**132**)以及**反汇编指令**和**代码示例**中的**XOR操作数量**: ![](<../../.gitbook/assets/image (547).png>) 如前所述,这段代码可以在任何反编译器中显示为**非常长的函数**,因为其中**没有跳转**。反编译的代码可能如下所示: ![](<../../.gitbook/assets/image (513).png>) 因此,可以通过检查**魔术数字**和**初始XOR**,查看**非常长的函数**,并将长函数的**一些指令**与一个实现(如左移7位和左旋转22位)**进行比较**来识别此算法。 ## RSA **(非对称加密)** ### 特征 * 比对称算法更复杂 * 没有常量!(自定义实现难以确定) * KANAL(一个加密分析器)无法显示RSA的提示,因为它依赖于常量。 ### 通过比较进行识别 ![](<../../.gitbook/assets/image (1113).png>) * 在第11行(左侧)有一个 `+7) >> 3`,与第35行(右侧)的 `+7) / 8` 相同 * 第12行(左侧)检查 `modulus_len < 0x040`,而第36行(右侧)检查 `inputLen+11 > modulusLen` ## MD5 & SHA(哈希) ### 特征 * 3个函数:Init,Update,Final * 初始化函数相似 ### 识别 **Init** 您可以通过检查常量来识别它们。请注意,sha\_init有一个MD5没有的常量: ![](<../../.gitbook/assets/image (406).png>) **MD5 Transform** 注意更多常量的使用 ![](<../../.gitbook/assets/image (253) (1) (1).png>) ## CRC(哈希) * 较小且更高效,因为其功能是查找数据中的意外更改 * 使用查找表(因此您可以识别常量) ### 识别 检查**查找表常量**: ![](<../../.gitbook/assets/image (508).png>) CRC哈希算法如下: ![](<../../.gitbook/assets/image (391).png>) ## APLib(压缩) ### 特征 * 无法识别的常量 * 您可以尝试在Python中编写算法并在网上搜索类似的内容 ### 识别 图形相当大: ![](<../../.gitbook/assets/image (207) (2) (1).png>) 检查**3个比较以识别它**: ![](<../../.gitbook/assets/image (430).png>)