【问题标题】:Finding AES Key in binary using Ghidra and FindCrypt使用 Ghidra 和 FindCrypt 在二进制文件中查找 AES 密钥
【发布时间】:2021-11-14 10:23:30
【问题描述】:

我想了解有关 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。之后情况如何?在所有教程中,我发现它看起来很简单,因为 Functions Finder 可以找到 AES 函数 - 但由于项目是 Bare Metal,这可能无法正常工作。

我认为 FindCrypt 会寻找某种可以生成密钥的十六进制模式...

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

【问题讨论】:

    标签: encryption aes reverse-engineering ghidra


    【解决方案1】:

    我认为 FindCrypt 会寻找某种可以生成密钥的十六进制模式...

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

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

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

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

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

    【讨论】:

      猜你喜欢
      • 2014-03-17
      • 1970-01-01
      • 2011-07-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-02-02
      • 1970-01-01
      相关资源
      最近更新 更多