Cryptographic/Compression Algorithms
Last updated
Last updated
学习并练习AWS黑客技术:HackTricks培训AWS红队专家(ARTE) 学习并练习GCP黑客技术:HackTricks培训GCP红队专家(GRTE)
如果你在代码中使用移位、异或和多种算术运算,很可能是实现了一个密码算法。这里将展示一些方法来识别所使用的算法,而无需逆向每一步。
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部分加载信息。 你可以访问这些数据,将第一个双字分组,并像前面的部分一样在Google中搜索:
在这种情况下,如果你搜索0xA56363C6,你会发现它与AES算法的表有关。
它由3个主要部分组成:
初始化阶段/:创建一个值表从0x00到0xFF(总共256字节,0x100)。这个表通常称为替代盒(或SBox)。
混淆阶段:将循环遍历之前创建的表(再次循环0x100次)并使用半随机字节修改每个值。为了创建这些半随机字节,RC4使用密钥。RC4的密钥可以是1到256字节的长度,但通常建议长度超过5字节。通常,RC4密钥长度为16字节。
XOR阶段:最后,明文或密文与之前创建的值进行XOR运算。加密和解密的函数是相同的。为此,将循环遍历创建的256字节,直到必要次数。在反编译的代码中,通常会被识别为**%256(模256)**。
为了在反汇编/反编译的代码中识别RC4,你可以检查大小为0x100的2个循环(使用密钥),然后将输入数据与在2个循环中之前创建的256个值进行XOR运算,可能使用%256(模256)
使用替代盒和查找表
可以通过特定查找表值(常量)来区分AES。注意常量可以存储在二进制文件中或动态创建。
加密密钥必须是16的倍数(通常为32字节),通常使用16字节的IV。
很少发现一些恶意软件使用它,但有例外(Ursnif)
通过长度(非常长的函数)很容易确定算法是否为Serpent。
在下图中注意常量0x9E3779B9的使用(注意这个常量也被其他加密算法如TEA - Tiny Encryption Algorithm使用)。 还要注意循环的大小(132)以及反汇编指令和代码示例中的XOR操作数量:
如前所述,这段代码可以在任何反编译器中显示为非常长的函数,因为其中没有跳转。反编译的代码可能如下所示:
因此,可以通过检查魔术数字和初始XOR,查看非常长的函数,并将长函数的一些指令与一个实现(如左移7位和左旋转22位)进行比较来识别此算法。
比对称算法更复杂
没有常量!(自定义实现难以确定)
KANAL(一个加密分析器)无法显示RSA的提示,因为它依赖于常量。
在第11行(左侧)有一个 +7) >> 3
,与第35行(右侧)的 +7) / 8
相同
第12行(左侧)检查 modulus_len < 0x040
,而第36行(右侧)检查 inputLen+11 > modulusLen
3个函数:Init,Update,Final
初始化函数相似
Init
您可以通过检查常量来识别它们。请注意,sha_init有一个MD5没有的常量:
MD5 Transform
注意更多常量的使用
较小且更高效,因为其功能是查找数据中的意外更改
使用查找表(因此您可以识别常量)
检查查找表常量:
CRC哈希算法如下:
无法识别的常量
您可以尝试在Python中编写算法并在网上搜索类似的内容
图形相当大:
检查3个比较以识别它: