这是一个非常有趣的挑战,您需要在不了解固件格式或架构的情况下反转固件。很可能该架构很特别,根本没有任何文档(例如,考虑一些军用芯片)。
http://queue.acm.org/unprogramming.cfm
我正在看这个,但坚持解决这个问题的方法是什么。有任何想法吗?
这是一个非常有趣的挑战,您需要在不了解固件格式或架构的情况下反转固件。很可能该架构很特别,根本没有任何文档(例如,考虑一些军用芯片)。
http://queue.acm.org/unprogramming.cfm
我正在看这个,但坚持解决这个问题的方法是什么。有任何想法吗?
我最近开始对一个设备的固件进行逆向工程,除了接口之外我没有其他文档。上一个答案中提供的演示文稿非常有帮助。我想我会用我当前项目的一些经验来补充它。
我在任何 RE 项目中的第一步都是提取字符串 - ASCII 和 Unicode。有时,strings
或者 IDA 可能无法找到所有内容,您可能需要检查十六进制代码,因为某些程序可能有一些不常见的编码机制。虽然在某些情况下字符串的存在可能不会为您提供太多信息,但没有任何字符串是压缩或加密的强烈迹象。就我而言,我能够检索包含有关某些内部程序信息的版权声明,以及包含的实时操作系统的版权声明。最有帮助。
小心binwalk
,它通常会为不常见的固件提供误报。不要依赖它的输出。
许多固件将具有类似的结构,即一些初始化,可能是开始时带有 RESET 中断的中断向量,然后最终跳转到引导部分,该部分会将更多组件加载到内存中。我发现bin2bmp工具可用于提供内容概述。注意:如果你在 Windows 中使用这个工具,你将需要Python Imaging Library
此外,固件中的每个程序至少都有代码和数据部分。代码部分将比数据部分大得多,根据我的经验,在数据部分之前。结合该bin2bmp
工具,您可以开始识别代码段。可能会添加有关堆、静态变量和异常处理的附加部分。
大多数开发人员将使用 C/C++ 作为他们的语言,有时使用汇编语言。使用 C/C++ 时,您可以安全地假设某些指令经常出现。Recon 的介绍中提到了RET
我认为是正确的说明。此外,功能结语和序言在整个固件中通常是相似的。如果您可以获得有关指令计数的一些统计信息,您就可以识别指令的特定字节/字/双字RET
。之后,观察前面的 2-3 个字节/字并验证它们是否在代码段中一起重复出现,表明您可能已经找到了函数的结尾。您可以在纯二进制模式下使用 IDA 轻松搜索字节字符串。函数的序言通常包括POP
存储返回地址或加载参数的指令。Epilog 通常PUSH
在RET
. 然后,您可以尝试在线查找指令集,这些指令集具有与您识别的字节/字相对应的POP
/PUSH
指令。在分析二进制文件时考虑字节序。
我包含了这些我发现对我的项目有用的文档,它们也可能对您有所帮助:
我将关注这个问题,因为我很想知道还可以做些什么来了解具有不常见架构的固件。