使用 Ghidra 和 FindCrypt 在二进制中查找 AES 密钥

逆向工程 拆卸 吉德拉 解密
2021-06-19 16:25:17

我想了解更多关于 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 寻找某种可能导致密钥的十六进制模式......

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

Ghidra FindCrypt 分析

1个回答

FindCrypt 不应该找到您的密钥,它应该找到与众所周知的加密算法相关的固定的、已知的常量。您可以在它的database.json 中看到它正在寻找的字节模式它已经完成了它应该做的事情。作为逆向工程师,您的工作是查看对它找到的表的交叉引用,看看您是否可以确定作为参数传递给加密或解密例程的密钥。