我有一个飞利浦10FF2相框,正在尝试进行反向工程。在从Philips网站(http://download.p4c.philips.com/files/1/10ff2cme_00/10ff2cme_00_fus_aen.zip)下载的固件中,我可以找到一个名为UBLDM350.bin的文件,当使用binwalk --disasm进行分析时,该文件将为我提供:

DECIMAL       HEXADECIMAL     DESCRIPTION
--------------------------------------------------------------------------------
0             0x0             ARM executable code, 32-bit, little endian, at least 984 valid instructions


我的问题是如何获得有关此文件的更多信息?我尝试用qemu-arm运行它,但失败了: >
walterheck@walter-toshiba:~/projects/pictureframe/PHILIPS.10FF2M$ qemu-arm ./UBLDM350.BIN 
Error while loading ./UBLDM350.BIN: Permission denied


我正在寻找下一步的帮助。

#1 楼

障碍分析固件所面临的困难之一是固件二进制文件通常不具有标准格式,并且不能像ELF或PE二进制文件那样以标准方式分离代码和数据。固件二进制文件中缺少清晰可识别的分区,无法快速,准确地识别以及区分代码和数据,这对于反汇编而言是个问题,因为像Capstone这样的反汇编程序(用于通过binwalk来识别CPU架构) )或Radare2将反汇编数据(例如ASCII字符串)作为操作码和操作数。如果执行了--disasm,我们看到从偏移量0x130到偏移量0x4224(范围为16628字节)被相当均匀地检测到了ARM代码:
要打印反汇编的指令,反汇编代码的内存地址范围远小于此范围(UBLDM350.BINbinwalk -A = 3932字节):

$ binwalk -A UBLDM350.BIN

DECIMAL       HEXADECIMAL     DESCRIPTION
--------------------------------------------------------------------------------
304           0x130           ARM instructions, function prologue
792           0x318           ARM instructions, function prologue
1396          0x574           ARM instructions, function prologue
8008          0x1F48          ARM instructions, function prologue
9380          0x24A4          ARM instructions, function prologue
9880          0x2698          ARM instructions, function prologue
9908          0x26B4          ARM instructions, function prologue
10024         0x2728          ARM instructions, function prologue
10320         0x2850          ARM instructions, function prologue
13036         0x32EC          ARM instructions, function prologue
13080         0x3318          ARM instructions, function prologue
13196         0x338C          ARM instructions, function prologue
13548         0x34EC          ARM instructions, function prologue
15912         0x3E28          ARM instructions, function prologue
16872         0x41E8          ARM instructions, function prologue
16932         0x4224          ARM instructions, function prologue


为什么?指令损坏会导致Capstone在偏移量binwalk --disasm --verbose之后停止反汇编:


默认情况下,Capstone遇到指令破裂会停止反汇编。大多数情况下,原因是这是输入中混合的数据,并且Capstone无法理解此“怪异”代码是可以理解的。下一个代码是,然后继续从该位置拆卸。1




上面我们看到,在偏移量0x00的指令之后确实存在无效的指令。

以下某些数据被分解为代码:

$ binwalk --disasm --verbose UBLDM350.BIN

Scan Time:     2017-05-07 10:56:43
Target File:   /home/c/firmware/Philips/10FF2cme_pictureframe/PHILIPS.10FF2M/UBLDM350/UBLDM350.BIN
MD5 Checksum:  15b2dac3ce98d3308d9c6cf47e74eba7

DECIMAL       HEXADECIMAL     DESCRIPTION
--------------------------------------------------------------------------------
0             0x0             ARM executable code, 32-bit, little endian, at least 984 valid instructions
0             0x0             ldr r0, [pc, #0x124]
4             0x4             mcr p15, #0, r0, c9, c1, #0
8             0x8             mov r0, r0
12            0xC             mrs r0, apsr
16            0x10            bic r0, r0, #0x1f
20            0x14            orr r0, r0, #0x11
24            0x18            msr cpsr_fc, r0
28            0x1C            ldr sp, [pc, #0xf4]
32            0x20            ldr r0, [pc, #0xf4]
36            0x24            add sp, sp, r0
40            0x28            mrs r0, apsr

< snip >

3888          0xF30           lsl ip, ip, #0x16
3892          0xF34           lsr ip, ip, #0x16
3896          0xF38           strh ip, [sp, #0x16]
3900          0xF3C           ldrh ip, [sp, #0x14]
3904          0xF40           ldr r0, [sp, #4]
3908          0xF44           ldrb r1, [ip, r0]
3912          0xF48           ldrb r2, [sp, #0x16]
3916          0xF4C           eor r1, r2, r1
3920          0xF50           strb r1, [ip, r0]
3924          0xF54           mov r0, #0
3928          0xF58           add sp, sp, #0x1c
3932          0xF5C           bx lr




由于没有标题可为内核程序加载器提供在内存中创建过程映像所需的信息,例如入口点和二进制布局信息,因此无法直接执行二进制文件。

选项

1。 Unicorn

可以使用Unicorn引擎动态分析成功反汇编的代码,以进行进一步研究。有关更多信息,请参见此问答:

Unicorn和QEMU:示例用例以了解差异

2。设备处理器标识

如果您可以直接访问硬件,那么确定确切的处理器/微处理器可能很有用,因为这将使您可以找到技术参考手册和数据表,这些内容将在详细介绍了设备的内存布局和指令集架构。内存布局知识将有助于固件二进制文件的分析。

3。十六进制转储分析

分析十六进制转储可以使您手动识别固件的非代码部分。 Capstone,r2或其他反汇编程序可以将仅包含代码的部分切出并反汇编。

4。可视化

使用0xF5C可视化固件二进制文件可以深入了解二进制文件的整体结构。熵图可以快速识别压缩的或连续的空字节区域。 binvis.io也是二进制可视化的有用来源。

另请参见:

从二进制文件中提取有用信息的方法



1。 SKIPDATA模式

评论


花了我一段时间回到这个项目。我现在正在摆弄您的一些建议。至于选项2:我确实可以访问硬件本身。中央芯片似乎是TI的DMSoc,由TMS320DM350ZWK标识。该产品似乎已在以后以TMS320DM355的形式发布,其数据表位于:ti.com/lit/ds/symlink/tms320dm355.pdf。

–沃尔特·赫克(Walter Heck)
17年5月29日在20:51

根据数据表,@ WalterHeck,该设备使用ARM926EJ-S处理器

– julian♦
17年5月29日在23:17



#2 楼

为了增加SYS_V的良好答案,这种“怪异”的代码和数据混合实际上在ARM代码中很常见。没有足够的空间来编码32位立即数。相反,ARM编译器通常会做两件事-


它们将32位立即数放在需要常量的函数的指令之后,并且它们使用PC-函数中的相对负载指令将这些常量放入寄存器中。

在SYS_V的反汇编中,位于地址0x00000F080x00000F28的指令均为PC相对负载。 (尽管反汇编程序在这里很有帮助,并且显示的是计算出的地址0x00000FF80x00000FFC而不是显示[PC,offset]。)

反汇编程序还非常有用,并且在反汇编时用红色注释了显示的值。立即加载的常量。在这种情况下,加载的值分别是0x01E100D40x01E100DC

通常会按访问函数的地址的顺序查看存储在函数之后的立即数。因此,在这种情况下,该函数以0x00000F5C处的指令结尾,并且立即数常量似乎跨越了0x00000F600x00000FFF的地址范围,我通常希望以下函数从地址0x00001000开始。

知道了这一点,反汇编程序就有可能识别此模式并自动跳过关联的数据。

#3 楼

看来您有一个原始固件文件,而不是用户模式可执行文件。 qemu-arm仅支持用户模式ARM Linux ELF可执行文件。从理论上讲,您可以尝试使用全系统仿真器(qemu-system-arm),但是除非QEMU明确支持底层硬件,否则不要期望它能正常工作。也可以使用基于QEMU的Unicorn仿真器,该仿真器更加灵活,但是您需要编写一些代码来加载文件并开始仿真。没有方便使用的现成程序。