0

我想了解更多关于 RE 的信息。

我在 STM32F107 上编写了一个简单的程序,它只使用 AES128-ECB 加密和解密文本。

这是 C 代码(到目前为止,我故意省略了密钥):

    struct AES_ctx TestAes;
uint8_t key[16] =
        { MY_KEY_IS_HERE };
uint8_t InputText[16] =
        { 1, 2, 3, 4, 5, 6, 7, 8, 9, 0xa, 0xb, 0xc, 0xd, 0xe, 0xf, 0 };
AES_init_ctx(&TestAes, key);
AES_ECB_encrypt(&TestAes, InputText);
AES_ECB_decrypt(&TestAes, InputText);

现在我想在我的二进制文件中找到 16 字节的私钥。

当我在十六进制编辑器中打开二进制文件并搜索我的密钥时,我会连续找到所有 16 个字节。

我在 Ghidra 中加载了二进制文件,之前安装了FindCrypt,现在运行分析。

FindCrypt 现在找到 AES_Decrytion_SBox_Inverse 和 AES_Ecryption_SBox。

但两者都不是我的 AES 密钥,而是 SBox。之后情况如何?在所有教程中,我发现它看起来很简单,因为函数查找器可以找到 AES 函数 - 但由于项目是裸机,这可能无法正常工作。

我认为 FindCrypt 寻找某种可能导致密钥的十六进制模式......

附上了二进制文件。字节序很小,架构是 ARM Cortex(我认为?!)

Ghidra FindCrypt 分析

4

1 回答 1

1

我认为 FindCrypt 寻找某种可能导致密钥的十六进制模式......

这实际上是16 或 32 字节的任何序列。

在对较大的应用程序进行逆向工程时,这通常会更容易一些,因为未初始化内存的密钥往往会被一大片零包围。因此,您只需寻找恰好 16/32 对齐的字节“连续不超过 1 个零,周围有很多零”,您可能会找到键。但是鉴于您的程序结构,这可能不会发生。当您进行逆向工程时,永远不会有任何承诺。您经常需要使用许多不同的方法。

在您的情况下,您需要寻找对 AES_init_ctx 的调用,该调用将引用密钥,但自动找到密钥本身有点困难。

这里的重要教训是,正确的(随机)AES 密钥除了长度之外绝对没有其他结构。因此,不可能查看一个字节序列并说“这绝对是一个 AES 密钥”。另一方面,因为它们没有结构(大多数数据都有),所以通常很容易查看一个字节序列并说“这几乎可以肯定是一个 AES 密钥”。

(同样值得注意的是,几乎每个人都错误地创建了他们的 AES 密钥,它们基于人类可读的密码,因此它们具有相当多的结构。寻找恰好是 16/32 字节长的 ASCII 字符串通常是很多的比寻找 16/32 字节的随机二进制数据更有价值。)

于 2021-09-20T19:52:32.957 回答