从静态分析中定位内存分配函数

逆向工程 二元分析 记忆 静态分析 嵌入式
2021-07-06 04:34:10

我目前正在为嵌入式设备反转固件二进制文件。该设备使用了一种不常见的架构:它是一种改进的哈佛架构,在TMS320C55x芯片组上运行,带有一个不再存在的旧实时操作系统 (RTOS) (Byte-BOS) 并且我找不到任何手册 (如果你有,请告诉我)。固件中不使用标准库。

根据从 Internet Archive 找到的一些罕见文档,RTOS 实际上是一个管理任务、内存分配和进程间消息传递的微内核。在内核中,似乎有两个函数可以管理内存:fmem_allocfmem_free

我试图在固件文件中找到这些功能。我可以估计 RTOS 代码的位置,以及在该代码段中查找函数。我的目标是找到fmem_allocfmem_free函数和函数使用IDA调用它们。

由于我的目标是 TMS320C55x 体系结构,并且我有一个原始固件文件与一个整洁的COFF二进制文件,因此在没有实际仿真器的情况下进行调试非常困难,据我所知,对于该微处理器而言,仿真器仅基于硬件。因此,我似乎注定只能依赖静态分析。但是,如果有人知道调试原始固件的软件解决方案,我会非常感兴趣。的Code Composer Studio IDE只调试COFF二进制文件。

在我可以搜索的特定距离内是否有任何技术或 C55x 指令集可以识别此功能?或者至少减少要搜索的潜在功能的数量?我知道 RTOS 使用双链表来管理堆。我首先想到使用该malloc函数作为潜在模板,但发现它与我所看到的相去甚远,即将英特尔组装到 C55x,尤其是考虑到冯诺依曼和哈佛架构之间的差异。

任何帮助表示赞赏。谢谢。

PS 由于保密条件,我无法发布产品详细信息、固件文件或反汇编代码。我知道因此可能很难提供可靠的答案。

更新

自从我上一篇博文以来,我已经识别出使用相同 RTOS 的旧希捷固件二进制文件,但对于英特尔 8096。顺便说一句,目标 RTOS 是一个名为 Byte-BOS RTOS 的旧微内核,我在这篇文章中写过此操作系统中唯一可用的字符串是版权声明。但是使用 Seagate 固件,我可以看到与堆相关的错误消息。我可能会尝试将这些 8096 代码段转换为 C,然后在 TMS320C55x 上重新编译它们。

更新 2

所以我发现该平台的编译器/IDE 包含某种 C 库,其中包含一个简单的malloc()函数。我写了一个小的 C 程序,用它分配了一些内存,在包含的调试器中运行它并转储机器代码。在 IDAPython 中创建了一个快速字节字符串搜索功能,并将非指令值替换为“????” 让 IDA 只查找说明。不幸的是,它没有发现malloc()功能。我怀疑代码完全依赖于 RTOS 提供的内存分配函数,而不是库中的函数。我简直不敢相信它们会大不相同,因为两者都依赖于链表。无论如何,这就是我的情况。我可能会尝试模糊字节字符串以从库中找到类似于malloc()函数的代码部分

2个回答

我会按如下方式处理这个问题:

  1. 检查日志记录字符串。可能你会发现一些与分配相关的东西可以解决问题。

  2. 查找所有带有 1 个参数的函数(大小为malloc(),指针为free())。

  3. 跟踪这些函数的结果。malloc()结果通常NULL在使用后检查,很少用于数学运算。此外,malloc()函数的结果用于存储操作或memcpy().

  4. 调用后不使用自由函数参数。

  5. malloc()并且free()应该位于附近的地址。

这些启发式方法应该足以将可能的候选者的数量缩小到可观察的范围。

祝你好运。

从 TMS320C55x文档中可以清楚地看出该芯片支持多种内存模式。因此,像malloc这样的函数可能对每个函数都有不同的定义。我认为最明智的做法是确定内存模式并弄清楚如何在该模式下实现malloc

鉴于您的二进制文件已完全剥离并且大多数函数似乎已内联,您所能做的就是模式匹配。如果您想变得聪明,请找出一种构建CFG的方法,并尝试确定哪些地方可能需要malloc,并检查您的目标模式是否足够冗余。

希望这可以帮助。