对基于Philips TriMedia CPU的网络摄像机进行逆向工程(二) - 嘶吼 RoarTalk – 回归最本质的信息安全,互联网安全新媒体,4hou.com

对基于Philips TriMedia CPU的网络摄像机进行逆向工程(二)

xiaohui 逆向破解 2020-03-03 08:58:40
收藏

导语:在本文中,我将主要使用TriMedia PNX1300EH微处理器。

对基于Philips TriMedia CPU的网络摄像机进行逆向工程(一)

飞利浦TriMedia CPU

TriMedia微处理器最初由飞利浦制造,目前名为NXP(Nexperia)半导体(高通公司于2016年宣布收购NXP)。它是VLIW(超长指令字)处理器家族,这意味着它们可以使用哈佛架构同时并行执行给定数量的指令,其主要用途是用于DSP(数字)信号处理)。

一开始,TriMedia处理器的名称是“PNX”,后来改为“TM”。

TriMedia微处理器运行一个实时操作系统,称为pSOS。此外,也有人尝试将2.6 Linux内核分支移植到TriMediacpu上运行。

为了编写TriMedia微处理器的代码,需要用官方的SDK,它包含了你需要的所有东西(库、编译器、调试器、模拟器等),但是除了那些销售使用TriMedia处理器的大公司(例如D-Link和2Wire)之外,它是不可用的。但是,有一些兼容TriMedia的SDK,如Streaming Networks提供的IADK(集成应用程序开发工具包),专门为PNX1300系列设计。

另外,如果你想使用该处理器,还有一些配备TriMedia CPU的开发板,例如Streaming Networks提供的TriREF开发板。但是,这种包括IADK的板并不便宜。实际上,我联系了Streaming Network并向他们要了TriREF板,大约为5000美元,太贵了,我买不起。

在撰写本文时(2019年1月),我又有了其它选择,但其中不包括SDK。

在本文中,我将主要使用TriMedia PNX1300EH微处理器。

逆向TriMedia CPU的信息源

对TriMedia处理器进行逆向工程并不是一件容易的事,主要是由于缺少相关文档和工具。 互联网上关于TriMedia体系结构的文档很少,指令集文档很少,并且现有工具私有且昂贵。无论如何,我们可以使用一些旧的信息资源来开始我们的逆向工作。

开始研究的第一条信息来源是数据表,本文档包含有关处理器所有体系结构的信息。我们可以了解芯片中不同组件的主要思想,它们之间的相互作用方式,控制器使用的特定指令集等。如果你要从右边的引脚入手,则必须阅读数据表。

尽管专门针对JTAG研究,但另一个很好的信息来源是http://hackingbtbusinesshub.wordpress.com。即使该博客不再可用,仍然有一些副本存储在web.archive.org中。这个家伙在反转基于TriMedia CPU的2Wire路由器方面做得非常出色,并创建了一些出色的工具,例如2wiglet(基于urjtag,它是用于2Wire路由器和tm32dis的JTAG wiggler工具),这是TM32系列的TriMedia反汇编程序。

现在我们谈论JTAG,在上一节中,我提到了Monumental Data System提供的用于TriMedia CPU的JTAG PCI调试器。飞利浦还提供了一个官方的JTAG调试器,但是它比较特殊。TriMedia JTAG工具仅设计用于专有的JTAG电缆。 “电缆”实际上是一种复杂的编程设备。它是一个通过NetChip NET-2282外围控制器连接到PC的USB设备。编程器从其自己的EEPROM启动,并由带有NOR闪存和DRAM内存的Philips PNX1502 CPU驱动。

显然, IDA工具必不可少。 IDA从4.x版本(特别是4.21版本)开始就支持TriMedia CPU。

New features in version 4.21 (19/04/2002)
Processors
Trimedia (upon special request only)
[..]

如上所述,处理器模块仅在有特殊要求时才可用。我从HexRays请求了处理器模块,但他们不再提供。

最后,在这项研究期间,我收集了有关TriMedia(文档、工具)的各种信息,并将其存储在github中。

接下来,我将讨论TriMedia架构本身。

TriMedia PNX1300EH CPU

在本文中,我将不对CPU上的每个组件进行非常详细的描述,因为这没有任何意义。该处理器的最高速度为143MHz,可在2.5V电压下工作。它的内核称为DSPCPU,是通用的32位CPU,它还实现了某些媒体标准,例如MPEG-1和MPEG-2。以下是PNX1300的所有组件的框图:

1.png

我们已经看到DSPCPU使用了VLIW指令集,这使得每个时钟周期可以同时执行5个操作。 DSPCPU具有不同的“issue插槽”,总共五个,每个“issue插槽”具有不同数量的“功能单元”,总共27个,每个指令中包含的每个操作都可以将其作为目标。由于每个VLIW指令编码5个独立的操作,相对于其他指令,理解每个指令有点困难,跟踪控制流并不容易。

关于PNX1300的寄存器模型,它有128个32位通用寄存器,从r0到r127。在这128个寄存器中,有两个具有固定值。它们是分别包含整数值0和1的r0和r1,且主要用作布尔值TRUE或FALSE,不允许程序员写入r0或r1。

还有一个用于程序计数器(PC)的寄存器和四个特殊寄存器:PCSW(程序控制和状态字),DPC(目标程序计数器),SPC(源程序计数器)和CCCOUNT(自复位以来的时钟周期计数)。 PCSW通常用作包含标志的寄存器,例如32位和64位Intel平台中的EFLAGS和RFLAGS。重要的是要说明PNX1300 CPU具有可切换的bytesex(单位)。通过将BSX标志(位大小)写入PCSW寄存器,由软件完成bytesex切换。这意味着可以在同一执行中找到小端字节排序和大端字节排序。例如,加载和存储操作会观察PCSW寄存器中的BSX标志,以了解该操作应按小端还是大端顺序进行。如果BSX标志等于1,则使用小端字节排序。如果BSX标志为0,则使用大端字节排序。

DPC和SPC是用于异常处理的寄存器, CCOUNT寄存器是PNX1300中唯一的64位寄存器,用于循环计数,它计算自上次重置事件以来的时钟周期。

关于内存和MMIO,如数据表中所述,PNX1300在32位地址空间中定义了四个孔:内存孔,DRAM,MMIO和PCI孔。 DRAM从DRAM_BASE中指定的地址映射到DRAM_LIMIT寄存器中的地址。最大大小为64 MB。 MMIO位于MMIO_BASE处,固定大小为2 MB。 DRAM和MMIO的值是在BIOS引导时设置的。内存孔从地址0映射到0xFF,因此为256个字节。最后,所有未标记为DRAM,MMIO或内存孔的空间都应考虑在PCI孔中。以下是PNX1300中的内存映射图:

2.png

现在,让我们进入困难的部分。因为,我将尝试向你解释TriMedia ASM

TriMedia ASM及其指令集

我不了解其他VLIW处理器,因为这是我处理过的第一个处理器。Trimedia处理器是具有多个功能单元的VLIW处理器,你可以在一个指令字中最多进行5个操作。我可以证明,TriMedia ASM的功能非常的优秀。举个例子,下面是来自TM32处理器的一些程序集:

(* instruction 0   : 224 bits (28 bytes) long *)
(* offset          : 0x00000000 *)
(* bytes           : 00 18 4c 0c c0 80 c0 81 c3 80 c0 b5 c0 81 02 00 12 00 8c 00 20 90 40 40 40 20 a0 d0 *)
(* format bytes    : 0x0018 & 0xff03 = 0x0000, format in little endian bit order: 00 00 00 00 00  *)
   IF r1   uimm(0x61a618) -> r0,               (* 42 bits: 0 02 30 c0 0c 4c *)
   IF r7   ijmpi(0x90030001),                  (* 42 bits: 2 40 81 81 c0 80 *)
   IF r2   fadd r67 r1 -> r32,                 (* 42 bits: 1 01 02 c0 80 c3 *)
   IF r10  bitand r64 r3 -> r16,               (* 42 bits: 0 81 02 02 81 c0 *)
   IF r1   uimm(0xd0060024) -> r0;             (* 42 bits: 3 42 83 00 12 00 *)

与其他体系结构中的许多其他汇编语言一样,TriMedia ASM包含有关数学运算(整数和浮点),逻辑,加载和存储数据,分支等的指令;特殊之处在于,所有操作最多可以并行执行五个。每个操作都有其自己的功能单元,该功能单元基本上是CPU中用于分配某些操作组的预定义插槽。

数学整数操作进入“alu”单元,控制流操作进入“branch”单元,直接操作进入“const”单元,依此类推;根据数据表,PNX1300最多具有27个功能单元。

使TriMedia ASM难以理解的是其编码方案,指令被压缩在一个可变大小的流中,解压单元负责在指令被发送到CPU之前展开它们。

让我们以第一条指令为例:

IF r1   uimm(0x61a618) -> r0

你可以看到一个“IF”语句,位于真正的助记符之前,后面是“r1”寄存器字符串。所有这些意味着这是一个“受保护的”指令。 TriMedia CPU中的所有操作都可以受到保护(可选),受保护的操作有条件地执行,具体取决于“保护”寄存器的值。在此特定示例中,这意味着“ r1”(保护寄存器)寄存器控制uimm操作的执行(uimm操作将无符号的32位操作码修饰符n写入rdest)。如果r1寄存器为“真”,则将值0x61a618移入r0寄存器。但是,在这种情况下,反汇编程序的输出会出现不一致的情况。根据官方文档,iimm和uimm指令不受保护,因此,在这种情况下,我们可以假定无论r1寄存器的值是多少,值0x61a618都将存储到r0寄存器中。

另一个要强调的重要事项是寻址模式,下表中总结了这些寻址模式:

5.png

在这些寻址模式中,R[i]表示一个通用寄存器。所应用的比例因子(1/2/4)等于加载或存储的项目的大小,即,对于字节操作为1,对于16位操作为2,对于32位操作为4。有效的“ i”, “ j”和“  k”值的范围在体系结构的实现之间可能有所不同。 “ i”和“k“参数的值可以介于0到127之间。“ j”参数的值可以介于-64和63之间。例如, ‘ld32d(–8) r3’从地址 (r3 – 8))加载一个32位值。

现在,如何对所有这些操作进行编码?

TriMedia ASM压缩方案

为了理解TriMedia指令是如何编码的,我查看了我能找到的唯一文档,即“用于产生VLIW指令压缩的美国专利5787302软件”文档。另外,我使用了前面提到的TM32反汇编程序工具,以某种方式验证了我在文档中所读的内容。更好的解决方案是获得SDK或开发板,以编译一些代码并使用官方工具反汇编/调试它。

注意事项

我们需要学习的第一件事是区分“指令”和“操作”,TriMedia CPU中的每个指令最多可以有5种不同的操作。这些操作中的每一个都可以属于27个不同的功能单元中的任何一个,并被分配到相应的issue插槽中。TriMedia 32位CPU具有5个issue插槽。每个issue插槽代表CPU中处理每个操作的位置,并附加了适当功能单元类型的实例。

值得注意的是TriMedia CPU并不是唯一实现VLIW体系结构的CPU。还有其他诸如SHARC或C6000处理器之类的(或少于)5个issue插槽。

每个指令的长度将根据每个操作的大小而变化,TriMedia操作大小可以为26、34或42位。正如我们已经看到的,这些操作可以是保护的,也可以是不保护的,可以是零值的,一元的,也可以是二进制的(0,1或2个操作数),可以是无结果的,还可以包含直接参数(7位或32位)。惟一未压缩的操作是分支。每个操作都伴随着一些称为“格式位”的位,这些位包含有关操作的附加信息。指令的格式位位于先前指令中。由于TriMedia CPU每条指令有5个操作,这意味着我们总共有10个格式位(5个操作中的每一个有2个),因此,一个字节加上2个字节被使用。

格式位对于理解指令的编码非常重要,我们已经说过,在Trimedia CPU中,我们有5个issue插槽,这给了我们10个格式位。格式位将以矩阵表示法称为Format [j],其中j是位数。位Format [2i]和Format [2i + 1]给出有关issue插槽i的格式信息,其中0 <= i <= N。下表(表1)中解释了格式位的含义:

6.png

可以看出,操作对应于从左到右排列的issue插槽。

例如,如果Format = {1,1,1,1,1,0,1,0,1,0},则该指令包含三个34位操作({1,0},{1,0},{ 1,0})。

如上所述,操作可以具有26、34和42位。 26位操作被分解为2位部分,并与格式位和24位部分一起存储。 34位操作分为2位部分,24位部分和1个字节扩展名。 42位操作分为2位部分,24位部分和两个字节扩展名。这意味着使用五个42位操作加上10个格式位,我们可以拥有的最大指令大小为28个字节(224位)。如果进行数学运算,你将看到42位* 5个操作= 210位-> + 10个格式位= 220位= 27.5个字节,但是由于指令是按字节对齐的,因此我们必须添加四个填充位才能总共有28个字节。

此外,在指令的末尾有一个字节对齐的可选8位或16位操作扩展组,每个扩展都是字节对齐的。如果需要的话,这些扩展位用于将操作的大小从基本的26位扩展到34位或42位。

以上我们介绍了TriMedia架构,下文我们会接着介绍有关反汇编TriMedia代码的一些问题。

本文翻译自:https://blog.quarkslab.com/reverse-engineering-a-philips-trimedia-cpu-based-ip-camera-part-2.html#id8如若转载,请注明原文地址:
  • 分享至
取消

感谢您的支持,我会继续努力的!

扫码支持

打开微信扫一扫后点击右上角即可分享哟

发表评论