http://queue.acm.org/unprogramming.cfm
我正在研究此问题,但仍坚持解决此问题的方法。有任何想法吗?
#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
评论
逆转未知来源(美国,中国,台湾?)的未知数据转储,因此您甚至都不知道其中是否可能包含纯文本?并且针对未知的处理器和设备(洗衣机,手机或引导设备)导弹?)非常困难-但是,与您所指出的明确挑战不同,这种攻击会多久发生一次?当您面对带有已连接SPI的未知微控制器(根据供应商提供的固件)时,在硬件安全分析中经常会发生此问题。顺便说一句,如果有人缺少上面的链接,您可以在archive.org上找到文章。