使用Ghidra与FindCrypt查找STM32裸机二进制文件中的AES密钥
裸机ARM固件AES128密钥提取方案
原理澄清
FindCrypt插件的特征库仅覆盖AES算法内置的固定常量(如你识别到的加密/解密S盒),用户自定义的密钥属于可变数据,不在特征匹配范围内,因此无法通过FindCrypt直接定位,属于正常情况。
基于Ghidra的定位步骤
你已经完成基础分析识别到S盒,按以下流程操作即可快速找到密钥:
- 定位
AES_init_ctx函数
对找到的AES S盒做交叉引用,追溯到调用S盒的AES算法实现代码,其中接收2个输入参数(第一个为AES上下文结构体指针,第二个为密钥指针)的函数就是你代码中使用的AES_init_ctx。 - 追溯函数调用点
对AES_init_ctx做交叉引用,找到你业务代码中调用该函数的位置,对应C代码AES_init_ctx(&TestAes, key);的第二个入参就是密钥的存储地址。 - 提取密钥
跳转至上述入参指向的存储地址,即可读出连续16字节的AES128密钥。如果你已经知道密钥的部分片段,也可以直接在Ghidra内存视图中按字节搜索对应片段,直接定位到密钥位置。
备用验证方案
你代码中使用的明文是固定值{1,2,3,4,5,6,7,8,9,0xa,0xb,0xc,0xd,0xe,0xf,0},可以写脚本遍历固件中所有连续16字节的序列作为密钥,加密上述明文后和实际运行得到的密文做匹配,命中的序列就是目标密钥。
内容的提问来源于stack exchange,提问作者guenthernagel
相关产品推荐
相关产品推荐

