这是一个非常有趣的挑战,您需要在不了解固件格式或体系结构的情况下反转固件。该体系很可能是特殊的东西,根本没有任何文档(例如,考虑一些军事芯片)。

http://queue.acm.org/unprogramming.cfm

我正在研究此问题,但仍坚持解决此问题的方法。有任何想法吗?

评论

逆转未知来源(美国,中国,台湾?)的未知数据转储,因此您甚至都不知道其中是否可能包含纯文本?并且针对未知的处理器和设备(洗衣机,手机或引导设备)导弹?)非常困难-但是,与您所指出的明确挑战不同,这种攻击会多久发生一次?

当您面对带有已连接SPI的未知微控制器(根据供应商提供的固件)时,在硬件安全分析中经常会发生此问题。顺便说一句,如果有人缺少上面的链接,您可以在archive.org上找到文章。

#1 楼

在Recon 2012上有一个很好的演讲,关于如何对为未知处理器编写的程序进行逆向工程:


概述
幻灯片

PS。阅读有关该挑战的评论非常令人愉快;)

#2 楼

我最近开始对设备的固件进行反向工程,该设备除了接口之外没有其他文档。上一个答案中提供的演示非常有帮助。我以为我可以从我当前的项目中获得一些经验来补充它。 。有时,strings或IDA可能找不到所有内容,您可能需要对十六进制代码进行检查,因为某些程序可能具有一些不常见的编码机制。尽管在某些情况下,字符串的存在可能无法为您提供很多帮助,但是字符串的缺失是压缩或加密的有力指示。就我而言,我能够检索包含有关某些内部程序信息的版权声明,以及所包含的实时操作系统的版权声明。最有用。

注意binwalk,对于不常见的固件,这通常会带来误报。不要依赖其输出。

结构

许多固件将具有相似的结构,即一些初始化,可能是一个在开始时带有RESET中断的中断向量,最终跳转到引导部分,该部分会将更多组件加载到内存中。我发现bin2bmp工具有助于提供内容概述。注意:如果您在Windows中使用此工具,则还需要Python Imaging Library

。此外,固件中的每个程序都至少具有代码和数据部分。代码段将比数据段大得多,并且根据我的经验,数据段位于数据段之前。结合bin2bmp工具,您可以开始识别代码段。可以添加用于堆,静态变量和异常处理的其他部分。

函数

大多数开发人员将使用C / C ++作为其语言,有时会使用Assembly。使用C / C ++时,您可以放心地假设一些说明会经常发生。 Recon的演示文稿提到了RET指令,我发现它是正确的。此外,整个固件的功能结尾和序言通常相似。如果您可以掌握有关指令计数的统计信息,则可以识别RET指令的特定字节/字/双字。然后,观察前面的2-3个字节/字,并验证它们是否在代码段中再次出现,表明您可能已找到函数的结尾。您可以在纯二进制模式下使用IDA轻松搜索字节字符串。函数的序言通常由POP指令组成,用于存储返回地址或装入参数。结语通常在PUSH之前包含RET指令。然后,您可以尝试在线查找具有与您所标识的字节/字对应的POP / PUSH指令的指令集。在分析二进制文件时,请考虑字节顺序。

嵌入式设备安全固件逆向工程
嵌入式固件安全性的大规模分析

我急切地关注这个问题看看还有什么可以做的,以了解具有罕见架构的固件。

评论


binvis.io也非常适合可视化未知二进制文件。 Binwalk的熵图(-E)也可能会有所帮助。

–布伦丹·多兰·加维特(Brendan Dolan-Gavitt)
15年10月19日在18:40