对基于Philips TriMedia CPU的网络摄像机进行逆向工程(二) - 嘶吼 RoarTalk – 网络安全行业综合服务平台,4hou.com

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

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

导语:在本文中,我将主要使用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如若转载,请注明原文地址:
  • 分享至
取消

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

扫码支持

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

发表评论

 
本站4hou.com,所使用的字体和图片文字等素材部分来源于原作者或互联网共享平台。如使用任何字体和图片文字有侵犯其版权所有方的,嘶吼将配合联系原作者核实,并做出删除处理。
©2022 北京嘶吼文化传媒有限公司 京ICP备16063439号-1 本站由 提供云计算服务