如何使用固件分析识别微控制器型号
导语:在本文中,我们展示了一种使用固件分析来识别微控制器型号的方法。
微控制器对网络安全威胁和攻击的保护有限。因此,物联网 (IoT) 设备和依赖它们的嵌入式系统的安全性可能会受到损害。
为了提高物联网设备或其固件的安全性,您需要确切地知道使用了哪些微控制器。掌握这些知识为更深入的软件分析开辟了新的可能性,从而更有效地改进解决方案的性能和安全性。在本文中,我们展示了一种使用固件分析来识别微控制器型号的方法。
本文将对寻求自动执行微控制器识别过程的有效方法的嵌入式软件开发人员和逆向工程专家有所帮助。
什么是微控制器以及如何识别微控制器
如今,人们每天使用各种嵌入式系统和物联网设备,其中装有各种微控制器。微控制器或微控制器单元 (MCU) 是设计用于在嵌入式系统中执行特定操作的小型集成电路。
工程师经常在医疗物联网设备、汽车系统,甚至航天工业中使用 MCU。无论一个设备是测量你的心率、检测空气中的烟雾,还是管理你的智能汽车的能源消耗,都会有一整套微控制器参与到这个过程中。
一个基本的微控制器通常由三个核心组件组成:
处理器
记忆
输入/输出 (I/O) 外设
微控制器通常具有有限的内存和带宽资源,并且专用于特定任务。大多数微控制器都是定制的,没有前端操作系统。
由于资源有限,微控制器很容易成为网络犯罪分子的目标。这就是为什么要确保 IoT 设备得到适当的保护,解决设备所依赖的微控制器的特定漏洞和弱点至关重要。
当您拥有从头开始构建的自定义设备时,您可能会了解它的所有来龙去脉。但是,如果您的项目记录不完整,或者您必须使用您一无所知的物联网设备,那么首要任务是确定其使用的微控制器型号。
如何识别单片机型号?
试图将不同的二进制文件彼此区分开来可能具有挑战性,尤其是当二进制文件使用大量相似的代码或执行相似的功能时。在识别与微控制器相关的二进制文件时,您很容易遇到执行类似任务的函数,这会使事情变得比可执行二进制文件更加模糊。
然而,有一种有效的方法不仅可以识别微控制器的型号,还可以使过程自动化。
首先,让我们看一下识别MCU型号需要采取的关键步骤:
要自动化此过程并能够快速轻松地识别微控制器模型,您需要:
自动生成 C 风格的伪代码。您可以使用 IDA-Pro 或 Ghidra 等工具执行此操作。
从微控制器的代码或数据库中收集要搜索的微控制器的所有标头。
现在让我们看看如何使用这种方法识别未知的微控制器。
根据硬件地址识别MCU型号
在本节中,我们将讨论如何通过分析其外围设备的硬件地址来识别微控制器的型号。
由于外围设备使用硬件访问,你应该可以在单片机的二进制代码中看到对静态硬件地址的访问,而这些地址应该定义在一个C头文件中。此外,由于这些地址是硬编码的,因此它们不应受到二进制地址空间布局随机化 (ASLR)的严重影响。
要遵循我们的指南,您需要了解 C、Python和以下工具:
命令
IDA专业版
GNU 编译器集合 (GCC)
py-c-预处理器
我们将使用NXP的 S32 PPC 微控制器,特别是MPC5 定时器演示。但是,请记住,下面描述的方法可以应用于您遇到的任何 MCU。这种方法唯一可能效率低下的情况是,如果有一个与您的 MCU 模型非常相似的微控制器;例如,如果两个或多个 MCU 型号由同一家公司制造并且具有相同的外围设备。
现在让我们开始吧。
1.分析单片机源码
使用 MPC5 微控制器演示并在 IDA-Pro 中查看其源代码。您应该会以类似结构的模式看到一些对外围设备的引用。当您深入研究时,您将看到对MPC5744P.h标头的引用以及此类定义:
这些是对微控制器外围设备的硬编码引用。
你注意到它们是结构了吗?这意味着由于填充和对齐,它们在内存中看起来会略有不同。
这些结构地址将是您的关键信息来源,因此您需要通过解析来获取所有这些地址,而无需花费太多时间和精力。
2. 解析和排序来自标题的信息
由于手动查找和复制硬件地址是一项繁琐且耗时的任务,您可以尝试将此过程自动化。
由于结构地址是定义,您可以使用 GCC 通过以下命令解析它们:
在哪里
包含微控制器头文件的路径。
执行此命令允许转储所有#definitions预处理器值。然后,您可以通过使用grep 实用程序处理目标结构来过滤接收到的信息。
一旦获得 GCC 的输出,就可以使用正则表达式 (regex)来过滤定义名称和地址。在我们的示例中,我们将使用RE Python 模块在 Python 中使用正则表达式。
我们选择使用 Python 工具,因为 Python 易于阅读且易于学习。也不需要学习内存管理,相比其他一些语言,我们可以简单方便地完成我们的任务。
以下是如何在 Python 中使用正则表达式过滤数据:
注意:如果你遇到一些需要评估定义的场景
你将需要一个预处理器。预处理器将获取#definitions值并在预编译时解析出这些值,因此您不必通过多个标头手动搜索它们。
以下是使用 Python 的py-c-preprocessor执行此操作的方法:
现在,让我们回到我们的分析。
3.将二进制转储为C风格的伪代码
如果您的硬件地址排序正确,您应该看到每个新外围设备的地址从哪里开始,从而能够在二进制文件中找到外围结构。
但是,尝试在十六进制编辑器中解析二进制文件可能很困难。相反,您可以打开二进制文件并在 IDA Pro 中对其进行分析。
在 IDA Pro 中打开二进制文件后,您可以通过单击file → produce file → C file生成带有 C 风格伪代码的文件。带有 C 风格伪代码的文件将保存微控制器模型识别所需的地址。
4.在伪代码中搜索外设地址
一旦有了 C 文件,就可以开始搜索外围设备地址了。如果您查看带有 C 风格伪代码的文件,您会看到多行地址。
请注意,由于所存储信息的大小,这些地址在伪代码中略有偏差。
您应该能够简单地加载头文件,解析和排序定义,然后使用 C 风格的伪代码在文件中搜索它们。和上一步一样,可以使用regex解析C文件,使用parse_memory_locations_from_C_file函数过滤出自己需要的地址:
然后你需要将你从头文件中拉取的排序后的地址和在 C 风格的伪代码文件中找到的地址传递给perform_search函数。
注意:从技术上讲,如果您知道结构的大小,则可以在确切位置自动找到所有具有相同大小的结构。但是,我们不会描述这个过程,因为它超出了当前指南的范围。
5.识别单片机型号
使用 C 风格伪代码在文件中搜索外设地址后,您可以尝试识别您的微控制器。为此,将二进制文件标头中的硬件地址与 C 文件中的地址进行比较。通过计算不同微控制器的加权分数,您将能够识别您正在处理的那个。
以下是我们示例的结果:
加权得分最高的微控制器就是您要找的那个。在我们的例子中,它是 MPC5744P.h 微控制器。
要查看我们指南中使用的脚本的完整代码,请转到 Apriorit GitHub页面。
结论
微控制器是当今物联网设备的重要组成部分。了解特定设备包含哪些微控制器对于有效提高设备的性能和安全性是必要的。
发表评论