我目前正在为嵌入式设备反转固件二进制文件。该设备使用的是不常见的体系结构:这是一种改良的哈佛体系结构,在带有旧的实时操作系统(RTOS)的TMS320C55x芯片组上运行,该操作系统不再存在(Byte-BOS),并且我找不到任何手册如果有的话,请告诉我)。固件中未使用任何标准库。
基于Internet存档中的一些罕见文档,RTOS实际上是一个微内核,用于管理任务,内存分配和进程间消息传递。在内核中,似乎有两个功能可以管理内存:fmem_allocfmem_free
我试图在固件文件中找到这些功能。我可以估算RTOS代码的位置,以及在该代码段中查找函数。我的目标是找到fmem_allocfmem_free函数以及使用IDA调用它们的函数。
由于我的目标是TMS320C55x架构,并且我具有原始固件文件而不是纯净的COFF二进制文件,因此如果没有实际的仿真器,调试起来将非常困难,据我了解,该微处理器仅基于硬件。因此,似乎注定只能依靠静态分析。但是,如果有人知道用于调试原始固件的软件解决方案,我将非常感兴趣。 Code Composer Studio IDE仅调试COFF二进制文件。
我可以搜索一定距离内的任何技术或一组C55x指令来识别此功能吗?或者至少减少潜在功能的数量?我知道RTOS使用双链表来管理堆。我首先想到了将malloc函数用作潜在的模板,但发现它与我要查看的内容(即Intel组件到C55x)相差太远,尤其是考虑到冯·诺依曼和哈佛架构之间的差异。
任何帮助赞赏。谢谢。
附言由于保密情况,我无法发布产品详细信息,固件文件或反汇编的代码。据我了解,由于这个原因,可能很难提供可靠的答案。目标RTOS是一个称为Byte-BOS RTOS的旧微内核,我在本文中对此进行了介绍。该操作系统中唯一可用的字符串是版权声明。但是,使用Seagate固件,我可以看到与堆有关的错误消息。我可能会尝试将这些8096代码段转换为C,然后在TMS320C55x上重新编译它们。
更新2简单的malloc()函数。我写了一个小的C程序,分配了一些内存,在附带的调试器中运行它并转储了机器代码。我在IDAPython中做了一个快速字节字符串搜索功能,并用“ ????”替换了非指令值。供IDA仅查看说明。不幸的是,它没有找到malloc()函数。我怀疑代码仅依赖于RTOS提供的内存分配功能,而不是库中的功能。我几乎不相信它们会有很大的不同,因为两者都依赖于链表。无论如何,这就是我的意思。我可能会尝试模糊字节字符串以从库中查找类似于malloc()函数的代码段。

评论

不能将COFF标头添加到固件吗?从阅读规范来看,似乎COFF标头只有一个部分从地址0开始,没有可选标头,没有重定位,没有行号,没有符号表,没有字符串表,应该易于生成并放在原始二进制文件之前。

您可以尝试研究AVR上的malloc实现,这基本上是哈佛ARCH。

将COFF文件写入固件后,有关符号的大多数信息都将被删除。还添加了中断服务程序和向量。中断向量被添加到0x0,然后是ISR。无论如何,添加COFF标头都不会简化反汇编。我将检查AVR。

#1 楼

我将按照以下方式解决此问题:


检查日志字符串。可能会发现与分配有关的东西可以解决问题。
找到所有带有1个参数的函数(malloc()的大小和free()的指针)。
跟踪这些函数的结果。 malloc()结果通常在使用后根据NULL进行检查,很少在数学运算中使用。此外,将malloc()函数的结果用于存储操作或memcpy()
调用后不使用自由函数参数。
malloc()free()应该位于紧密地址中。

这些试探法应足以将可能的候选对象范围缩小到可观察范围。

祝你好运。

#2 楼

从TMS320C55x文档中可以明显看出,该芯片支持多种存储模式。因此,诸如malloc之类的函数可能对每个函数具有不同的定义。我认为最明智的做法是识别内存模式,并弄清楚如何在该模式下实现malloc。做的是模式匹配。如果您想变得聪明,请找出一种构建CFG的方法,并尝试确定可能需要malloc的位置,并检查目标模式是否足够冗余。
希望这会有所帮助。