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.BIN
至binwalk -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 楼
为了增加SYS_V的良好答案,这种“怪异”的代码和数据混合实际上在ARM代码中很常见。没有足够的空间来编码32位立即数。相反,ARM编译器通常会做两件事-它们将32位立即数放在需要常量的函数的指令之后,并且它们使用PC-函数中的相对负载指令将这些常量放入寄存器中。
在SYS_V的反汇编中,位于地址
0x00000F08
和0x00000F28
的指令均为PC相对负载。 (尽管反汇编程序在这里很有帮助,并且显示的是计算出的地址0x00000FF8
和0x00000FFC
而不是显示[PC,offset]
。)反汇编程序还非常有用,并且在反汇编时用红色注释了显示的值。立即加载的常量。在这种情况下,加载的值分别是
0x01E100D4
和0x01E100DC
。通常会按访问函数的地址的顺序查看存储在函数之后的立即数。因此,在这种情况下,该函数以
0x00000F5C
处的指令结尾,并且立即数常量似乎跨越了0x00000F60
至0x00000FFF
的地址范围,我通常希望以下函数从地址0x00001000
开始。知道了这一点,反汇编程序就有可能识别此模式并自动跳过关联的数据。
#3 楼
看来您有一个原始固件文件,而不是用户模式可执行文件。qemu-arm
仅支持用户模式ARM Linux ELF可执行文件。从理论上讲,您可以尝试使用全系统仿真器(qemu-system-arm
),但是除非QEMU明确支持底层硬件,否则不要期望它能正常工作。也可以使用基于QEMU的Unicorn仿真器,该仿真器更加灵活,但是您需要编写一些代码来加载文件并开始仿真。没有方便使用的现成程序。
评论
花了我一段时间回到这个项目。我现在正在摆弄您的一些建议。至于选项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