如何理解固件中的 RTOS?

逆向工程 艾达 固件 文件格式 固件分析 操作系统
2021-07-02 11:14:06

我正在对具有 Linux 和 RTOS 组件的固件进行逆向工程。我使用 binwalk 轻松定位 Linux 文件系统,提取它们,安装它们,现在我有了可以在 IDA Pro 中打开并继续工作的二进制文件。

但是,使用固件的 RTOS 端执行此操作要困难得多在我的目标固件映像中,我能够识别出 RTOS 位于上方内存地址中的 Linux 文件系统,通过对常见的 RTOS 相关事物执行一些字符串搜索。代码绝对是 ARM,可能是 32 位,little-endian。这是 Cortex-A7。我看到了表明它也可能是 ITRON RTOS 或 FreeRTOS 的工件。但本质上,binwalk 提取了 3-4 块包含所有这些的“数据”文件。所以我可以通过查看这些块中的字符串偏移量来获得一些有用的信息。由于大多数数据似乎是字符串和 ARM 指令,因此我在 IDA Pro 中打开了它们。IDA 解析需要很长时间,但是一旦解析完毕,一切都只是数据,需要手动转换为代码。这是我挂断电话的地方。我有两个主要问题:

  1. 像这样的 RTOS 系统是否有一个合适的“文件系统”,我可以像使用 Linux ext 和 squashfs 那样“安装”来查看二进制文件?我曾经使用 binwalk 使用过的所有文件系统都是 Linux 的。如果是这种情况,什么是常见的 RTOS 文件系统?
  2. 如果没有,我如何使用 IDA Pro 以清晰的方式查看这些块的 ARM 反汇编?
1个回答

大多数 RTOS 代码通常是单个整体二进制文件,不会像高级操作系统那样拆分为单独的二进制文件。通常有一些启动代码、一些库例程和用户提供的任务形式的代码,这些代码只不过是在简单的无限循环中执行必要工作的简单函数。RTOS 启动时调用的“main 函数”会注册任务,设置定时器、队列、信号量等共享资源,并调用 RTOS 入口点开始分派任务,周期性地在它们之间切换,以便每个人都有机会跑步。

虽然没有文件系统,但二进制文件中可能还有其他有用的信息。大多数 RTOS 允许您为任务命名,以便您可以找到一些字符串并从参考资料中发现任务创建/注册功能。有时会使用结构表(例如,带有名称的指针和指向任务函数的指针)。

要在 IDA 中强制反汇编一大块代码,您可以使用选择,例如:

  1. 转到代码的潜在开头(例如代码段的开头)
  2. 丢弃选择锚点 (Alt-L)
  3. 转到代码的末尾(例如,通过单击导航栏、滚动条或通过键盘)选择整个块。
  4. 按 C 并选择“分析”或“强制”(您可能需要进行试验,看看哪个更有效)

请注意,在某些情况下,数据也可能被解释为有效指令,因此您可能会得到误报(尤其是使用“强制”选项时),这可能需要您事后修复。但这应该可以帮助您入门并发现一些有效的代码。