我想从现实世界的嵌入式设备中收集一些旧固件映像。在深入探讨之前,我正在尝试确认一些高级观点。

通常可以从旧式嵌入式设备收集固件映像吗?我可以在这里提出一些障碍:


我知道许多嵌入式设备会禁用调试端口。
嵌入式系统具有所谓的“代码读取保护”机制为了防止用户下载固件

但是,我也了解以下事实:例如,可以通过滥用busybox从嵌入式设备中提取固件。其wget命令。像这样:受限的BusyBox shell
可以绕过“代码读取保护”,例如“调试端口”问题。

所以我想知道是否有人可以真正描绘出这里的风景,通常认为从嵌入式设备中提取旧固件很容易吗?常见的程序和最佳做法是什么?谢谢。

评论

这个问题的范围太广了。

@lllllllllllll:我强烈建议您编辑问题,使其范围更广一些。即使您提供的详细信息,即使他给出的答案已经尽可能全面,这甚至可能提示NirIzr给出更好的答案。因此,除非找到找到要解决的确切目标的人,否则这将和没有您提供的更多详细信息一样好。

尽管我同意这是一个非常笼统的问题,但我确实认为这可能对将来的读者有用。我不确定OP的意图是获取单个特定设备的答案。

@NirIzr不用担心,不会关闭或删除它。而且我同意,这将对未来的宇宙航行有用。

#1 楼

由于这个问题很笼统,因此很难提供一个非常技术性的答案。
您在这里已经问了很多问题,所以让我从总体概述入手,然后再回答所有问题具体问题。
一般概述
从嵌入式设备中提取固件映像的难度实际上取决于固件设备本身,以及您对该固件设备的访问权限。
我会说有根据您的实际目标,有几种不同的选择(例如,获取尽可能多的固件,而不是为您拥有或感兴趣的特定设备获取固件)。我将按升序列出一般选项:
在线获取固件映像/更新
由于许多设备支持某种固件更新机制,因此制造商通常可以通过以下方式提供固件映像:手动下载网页以进行手动更新,或通过提供空中更新的网络服务下载。尽管有时可以对这些更新进行加密,但是在大多数情况下,它们只是经过签名-因为实际的威胁状况正在修改固件而不是读取固件。
由于固件更新的格式可能比原始格式更难理解例如,您需要花费更多的精力来理解格式,从固件更新文件中提取固件资产,并有选择地实施一些固件加载逻辑以获取可用的内存映像/地址。 Binwalk之类的工具是一个不错的起点。
如果只能通过无线方式获取固件,则还需要花费时间来了解无线协议以及服务器端对资产的限制。服务器可能会拒绝提供您特别感兴趣的旧版本,或者要求某种基于设备的标识/身份验证。
使用应用程序信息泄漏漏洞
想到的最简单的示例是许多嵌入式设备上经常存在的Web应用程序中的信息泄露漏洞,但是可能还有其他相关目标。与经常泄漏指针,地址和内存数据的本机信息泄露漏洞不同,Web信息泄露漏洞通常会暴露文件和存储的数据。如果它存储在同一存储器中或已挂载(始终或在运行更新时),则这可能使您能够提取其他相关信息(例如,探测硬件设备/接口),甚至访问固件。 br />在可以进行外壳访问的情况下,通过软件读取固件
由于已知漏洞或无需实际读取任何代码即可轻松发现的漏洞,无需查看固件即可使用Shell或root访问权限。设备也可以出于调试目的而提供某种类型的终端访问。例如,可以使用命令注入来仅执行一个shell命令,而不是使用功能完善的终端。
一旦访问,这主要是探查任何可用资产并恢复任何内容的问题。您可以。
如果物理访问可用,则可以通过硬件读取固件
由于这通常是提取固件映像的最具挑战性的方法,因此您可能偶尔会幸运地注意到这种方法很容易就像拉SD卡并将其插入计算机一样。不过,这种情况并不常见。由于该特定主题非常庞大,您似乎正在寻找概述,因此我将不深入介绍这些特定主题。
当对设备的物理访问可用并且任何调试端口,uart或串行端口可用时,您可能经常会发现它们对于提取有关固件的详细信息非常有用。这些功能中的某些功能也可以通过以太网端口使用。这些调试接口通常提供对不同组件(例如存储或控制引导顺序)的原始访问。
尽管有时由于暴露出未连接的针头和现有的针脚标签打印输出,如下图所示,识别这样的端口很容易:

左侧为未安装的针头,右侧为针脚标签。点击放大
当没有标签打印并且没有针头连接时,不同的调试端口也可能更难识别。这里提供了一个可识别暴露的和隐藏的调试端口的演练示例。
当调试端口不足时,下一步就是直接从存储芯片读取固件。这通常包括要么将其从板中取出,并使用自己的电子电路从芯片中读取内存,要么在仍将其连接到原始板时将其挂接到芯片上,或者在设备读取或发出数据时被动地监听数据您自己的阅读说明。首先,您需要确定圆形零件及其用途以及制造商数据表。显然,这也需要专用的硬件。通用板可用于此目的(某些专用于固件提取和硬件逆向工程,如GoodFET和BusPirate),如果愿意将其出售给使用专有电路内串行编程的芯片制造商,您还可以从中获得一些开发设备。您。
您甚至可以使用对芯片管芯层的电学和光学分析,甚至直接从芯片读取数据,但这似乎不太可能。
回答您的特定问题
/>
通常可以从旧式嵌入式设备收集固件映像吗?

如前所述,这在很大程度上取决于特定的设备及其保护程度。它通常可用于大多数便宜的设备,但是随着设备变得更昂贵,您可以认为它会变得更加复杂,从而间接地带来更多的困难。
还必须注意,排除真正昂贵和/或经常使用的设备目标设备(智能手机就是其中的一个很好的例子),大多数困难不是来自制造商积极地尝试使固件提取更加困难,而是更多地来自于设计决策和产品选择,并且恰好影响提取固件的难度图片。


我知道许多嵌入式设备都禁用了调试端口。


尽管有时为了提高安全性或为了避免这种情况,可能会出现这种情况。为了降低成本,完全删除调试端口会使维修和质量检查更加困难。通常,尽管可能会包括调试端口,但为了方便访问,可能会布置方便的引出线,但是为了方便访问,可以使用磁头,也可以不使用,如下图所示:

步骤硬件逆向工程教程


嵌入式系统具有所谓的“代码读取保护”机制,可以防止用户下载固件


便宜的设备通常不会为代码读取保护打扰,尽管有相对困难和特定的趋势,但仍有一些方法可以绕过它。一种这样的方法是删除存储芯片并直接与之交互以提取固件映像,正如我之前在物理访问(如果可用)中通过硬件读取固件中提到的那样。


固件可以可以通过滥用busybox(例如其dd命令)从嵌入式设备中提取。类似的东西:受限的BusyBox shell



这种方法是我在上面提供的Shell访问时通过软件读取固件中讨论的示例。在您链接的示例中,wget用于在获取数据后对其进行过滤,但是其创造力没有限制(甚至可以使用可用的LED来编码二进制数据)。


可以绕过“代码读取保护”,因此对于“调试端口”问题


是的,通过稍微先进的硬件逆向工程工具和功能可以从具有读出保护功能的芯片中提取软件,使用未安装的设备端口,避免使用调试端口,使用芯片的数据表来识别如何正确读取数据,并在读取数据时对其进行封杀通过现有电路等...

通常认为从嵌入式设备中提取旧固件很容易吗?常见的程序和最佳做法是什么?

如本帖所示,并重复几次,根据具体情况,这可能相对容易,也可能相对困难。通用过程也相差很大。
进一步阅读
硬件逆向工程的主题很大,很难在SO文章中将其全部介绍。您应该花更多的时间阅读,观看演讲和进行演练,以获取有关该主题的更多知识。以下是一些资源:

IC逆向工程的最新技术概览


让您的触角不离我的公共汽车和其他谈话由Dmitry Nedospasov编写。
这是Travis Goodspeed取消封顶的固件提取的硬性示例。

本入门级课程,由五个部分组成的硬件/固件反向工程演练。使用Null取消引用错误。

以及许多其他在线资源。

评论


很棒的答案!我非常感激。我将详细阅读您的答案,并在以后留下更多评论。照顾自己!

– lllllllllllll
18-10-2在13:06

再次感谢您提供详细信息。只是另一个问题(快速?),我一直认为固件(无线)更新是一种罕见的情况,只能由专家来处理。因此,可以从实际设备中提取的许多固件映像有些“过时”。要获得最新的固件,您可能必须在线爬网。这对您有意义吗?

– lllllllllllll
'18 -10-2在14:56

是。对于许多没有无线更新的设备,用户将必须手动更新。

– NirIzr
18-10-2在14:59

好的我知道了。但是另一方面,用户可能需要一些高级技能来进行更新,或者他们基本上没有动力这样做。因此,我认为该论点足以证明“现实嵌入式设备中的许多固件”已经过时了。因此,我们将需要访问他们的网页以获取最新版本。

– lllllllllllll
18-10-2在15:00

是的绝对是用户不必理会所有这些事情

– NirIzr
'18 -10-2在15:03