我有一个固件,该固件是我从NXP LPC17XX系列芯片上取下来的。通过阅读处理器手册,我能够确定代码的入口点并反汇编代码,而IDA Pro中没有任何问题。稍作反转后,我发现了许多可能是printf,sprintf及其关联的辅助函数的函数。

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

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

#1 楼

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

例如如果未知函数为“ strlen”,则可能是一个测试用例:当您使用单个参数“ AAAAAAA”调用它时,它应该不会崩溃并返回7。从一个已知的库中学习测试用例,并尝试在一个未知的二进制文件中找到匹配的函数。

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

#2 楼

对C代码使用FLIRT要求您了解CRT的确切版本和编译的确切标志,以便您可以自己构建它,然后在拥有所有二进制文件和调试符号的情况下,从.a或.obj或创建签名。 lib。
但是使用各种版本的编译器构建的CRT有很多变体。由于无法确定构建标志,因此在这种情况下您不太可能使用FLIRT。
因此,您可以做的最好的事情就是静态分析。在固件中,通常有足够的断言消息和错误日志记录,可以帮助您确定一些基本的东西,例如alloc,free,fopen,fwrite,fread,fclose。 sprintf也很容易找到。
还利用CRT函数分组在一起的事实,即,如果找到一个CRT函数,那么它上面和下面的函数(我在说地址)也是库函数。