由于这个问题很笼统,因此很难提供非常技术性的答案。
您在这里问了很多问题,所以请让我从一般概述开始,然后继续回答您的所有具体问题。
总体概述
从嵌入式设备中提取固件映像的难度实际上取决于固件设备本身,以及您对该固件设备的访问权限。
我想说,根据您的实际目标,有几种不同的选择(例如,获取尽可能多的固件而不是获取您拥有或感兴趣的特定设备的固件)。我将按难度升序列出一般选项:
在线获取固件映像/更新
由于许多设备支持某种固件更新机制,因此制造商通常通过手动网页下载进行手动更新或通过将提供无线更新的网络服务提供固件映像。尽管这些更新有时可能会被加密,但在大多数情况下,它们只是经过签名的——因为实际的威胁环境是修改固件而不是读取固件。
例如,由于固件更新的格式可能比原始dd
转储更难理解,因此您需要花费额外的精力来理解格式、从固件更新文件中提取固件资产并有选择地实施一些固件加载逻辑以获得可用的内存图像/寻址。像binwalk这样的工具是一个不错的起点。
如果固件只能通过无线方式获得,您还需要花时间了解无线协议和任何服务器端对服务资产的限制。服务器可能会拒绝提供您特别感兴趣的旧版本,或者需要某种针对每个设备的标识/身份验证。
使用应用程序信息泄漏漏洞
想到的最简单的例子是Web 应用程序中的信息泄露漏洞,这些漏洞通常存在于许多嵌入式设备上,但可能还有其他相关目标。与通常会泄露指针、地址和内存数据的本地信息泄露漏洞不同,Web 信息泄露漏洞通常会暴露文件和存储数据。这可能允许您提取其他相关信息(例如,探测硬件设备/接口),或者如果固件存储在同一存储上或安装(始终或更新运行时),甚至可以访问固件。
当 shell 访问可用时通过软件读取固件
由于已知漏洞或无需实际阅读任何代码即可轻松发现的漏洞,您无需查看固件即可获得 Shell 或 root 访问权限。设备还可以提供某种终端访问以用于调试目的。例如,可以使用命令注入来执行单个 shell 命令,而不是完整的终端。
一旦您获得访问权限,这主要是探索任何可用资产并尽可能地恢复。
在物理访问时通过硬件读取固件(如果可用)
由于这通常是提取固件映像最具挑战性的方式,因此您有时可能会很幸运,因为这种方法就像拔出 SD 卡并将其插入计算机一样简单。然而,情况并非经常如此。由于这个特定主题非常庞大,而且您似乎正在寻找概述,因此我不会深入研究细节。
当对设备的物理访问可用并且任何调试端口、UART 或串行端口可用时,您通常会发现它们对于提取有关固件的详细信息非常有用。其中一些功能也可以通过以太网端口获得。这些调试接口通常提供对不同组件的原始访问,例如存储或控制启动顺序。
由于暴露的未连接针头和现有的针标签打印输出,有时识别这样的端口很容易,如下所示:
左侧是未安装的针头,右侧是针标签。点击放大
当没有打印标签并且没有连接针头时,不同的调试端口也可能更难识别。此处提供了用于识别公开和隐藏调试端口的演练示例。
当调试端口不足时,下一步直接从存储芯片读取固件。这通常包括要么将其从电路板中取出并使用您自己的电子电路从芯片中读取内存,要么在芯片仍连接到原始电路板时将其连接到芯片上,但要么在设备读取数据时被动地侦听数据,要么发出您自己的阅读说明。您首先需要确定圆形组件及其用途,以及制造商数据表。这显然也需要专用硬件。为此目的存在通用板(一些专门用于固件提取和硬件逆向工程,如GoodFET和BusPirate) 并且您还可以从使用专有电路串行编程的芯片制造商那里获得一些开发设备,如果他们愿意将这些设备出售给您的话。
您甚至可以使用芯片管芯层的电学和光学分析直接从芯片读取数据,但这对您的情况似乎不太可能。
回答您的具体问题
通常是否可以从传统嵌入式设备中收集固件映像?
如前所述,这在很大程度上取决于特定设备及其可能受到的保护。对于大多数便宜的设备来说,它往往是可行的,但随着设备变得越来越昂贵,您可以假设它会更复杂并间接导致更多困难。
同样重要的是要注意,排除真正昂贵和/或经常有针对性的设备(智能手机就是其中的一个很好的例子),大多数困难不是来自制造商积极尝试使固件提取更加困难,而是更多地来自设计决策和产品选择,恰好会影响提取固件映像的难度。
- 我知道许多嵌入式设备禁用了调试端口
虽然有时这可能是为了提高安全性或降低成本,但完全删除调试端口会使维修和 QA 变得更加困难。通常,虽然可能包含调试端口,但可以布置方便的引脚布局以方便访问,无论是为了方便访问还是不使用,如下图所示:
图片取自此一步一步的硬件逆向工程教程
- 嵌入式系统具有所谓的“代码读取保护”机制,以防止用户下载固件
较便宜的设备通常不会为代码读出保护而烦恼,并且有一些方法可以绕过它,尽管这些方法往往相对困难和具体。一种这样的方法是移除存储芯片并直接与其交互以提取固件映像,正如我之前在物理访问时通过硬件读取固件(如果可用)中提到的那样。
- 可以通过滥用busybox(例如其
wget
命令)从嵌入式设备中提取固件。类似的东西:有限的 BusyBox 外壳
这种方法是我在上面的当 shell 访问可用时通过软件读取固件中讨论的示例。在您链接的示例中,wget
用于在您获得数据后进行数据泄露,但其创造力没有限制(甚至可以使用可用的 LED 对二进制数据进行编码)。
- 可以绕过“代码读出保护”,因此“调试端口”问题
是的,通过稍微先进的硬件逆向工程工具和能力,可以从具有读出保护的芯片中提取软件,使用设备端口,尽管它没有安装,避免需要调试端口,使用芯片的数据表来识别如何正确读取数据,在现有电路读取数据时对其进行窃取等...
从嵌入式设备中提取旧固件是否通常被认为容易?什么是通用程序和最佳实践?
如这篇文章所示,并重复多次,这可能相对容易或相对困难,具体取决于具体情况。常见的程序也有很大差异。
进一步阅读
硬件逆向工程的主题非常广泛,很难在 SO 帖子中涵盖所有内容。您应该花更多的时间阅读、观看演讲和跟踪演练,以获取有关该主题的更多知识。以下是一些资源:
- 的调查的国家的最先进的IC逆向工程
- 保持你的触角离我的车和其他的会谈由梅德Nedospasov。
- 这个通过Travis Goodspeed 去壳提取固件的核心示例。
- 此介绍性级别的硬件/固件逆向工程演练由五部分组成。
- 关于使用 Null 取消引用错误的实际提取的演示。
以及许多其他在线资源。