识别固件中静态链接函数的最佳方法

逆向工程 艾达 固件 手臂 调情签名
2021-06-15 08:53:19

我有一个固件,我从 NXP LPC17XX 系列芯片上取下来。通过查看处理器手册,我能够确定代码的入口点并在 IDA Pro 中没有任何问题地反汇编代码。经过短暂的逆向之后,我发现了许多可能是 printf、sprintf 及其相关辅助函数的函数。

我假设我正在查看的固件中包含许多其他 POSIX 函数以及一些用于开发该芯片的核心库函数。

识别这些功能的最佳方法是什么?我假设有一些方法可以为此开发 FLIRT 签名,但我不确定为该固件开发适当签名的最佳方法是什么。任何帮助或指导将不胜感激!

2个回答

有一个基于符号执行框架miasm 的名为Sibyl的项目他们基本上用测试用例调用每个未知函数,直到它通过给定假设的所有测试用例。

例如,如果未知函数是“strlen”,则一个测试用例可能是:当您使用单个参数“AAAAAAA”调用它时,它应该不会崩溃并返回 7。

Sibyl 还允许您从已知库中生成和学习测试用例,并尝试在未知二进制文件中查找匹配函数。

我必须承认我并没有真正使用它,我只是偶然发现了它,因为我使用 angr 创建了一些模糊的类似的东西,并查看了源代码。Sibyl 支持 ARM,因此您可能想尝试一下。

将 FLIRT 用于 C 代码需要您知道 CRT 的确切版本和编译的确切标志,以便您可以自己构建它,然后拥有所有二进制文件和调试符号,从 .a 或 .obj 或 .库 但是有许多不同版本的编译器构建的 CRT 变体。并且无法确定构建标志,因此在这种情况下您不太可能使用 FLIRT。所以你能做的最好的事情就是静态分析。在固件中,通常有足够的断言消息和错误日志,可以帮助您确定一些基本内容,例如 alloc、free、fopen、fwrite、fread、fclose。sprintf 也很容易找到。还可以使用 CRT 功能组合在一起这一事实,即如果您找到一个,则在其上方和下方的功能(我