这个问题的目的是要了解反向工程背后的概念,并了解可以采取什么方法从二进制文件中提取有用的信息。

我已经获得了一个.hex文件。然后使用hex2bin将其转换为二进制文件:

./hex2bin firmware.hex


然后我搜索了一些可读的字符串:

strings firmaware.bin
...
WATT
MODE 
TEMP 
MEMORY
 MODE 
 STRENGTH
  MIN 
SOFT
NORM
HARD
 MAX 
BLUETOOTH
   ON    
   OFF   
   LED   
STEALTH
 OFF  
  ON  
  TODAY
...


我也尝试运行binwalk,但输出为空:

    binwalk firmware.bin 

    DECIMAL       HEXADECIMAL     DESCRIPTION
    --------------------------------------------------------------------------------


第一个问题:为什么输出为空? br />
我还尝试检查熵以猜测文件是加密还是压缩。

binwalk -E firmware.bin




如另一个答案所建议,我着手使用radare2来查找原始的ARM代码(我对该工具完全陌生);特别是我想提取此文件中使用的所有功能:问题二:这些功能在.bin文件中使用(因此在原始源代码中) ),我正确吗?

问题三:如何在使用找到的字符串的地方提取数据?

问题四:可以从该文件中提取哪些有用的信息?

这时我被困住了。我是新手,因此我想学习如何处理无法从工具(例如binwalk)获得有用信息的情况。因此,如果有人可以建议我应该采取什么步骤来提取有用的信息(我的意思是指出要理解的概念,在哪里找到信息,有用的资源,书籍等),我将不胜感激。如果有人可以告诉我如何继续使用此文件,那就太好了,因此我可以直接看到一些结果并继续进行研究。

预先感谢。

这是文件:http://www.3fvape.com/images/3fvape-blog-img/20150806-4384-xcubeII-upgrade/SMOK_X_CUBE_II_firmware_v1.07.hex
源文件为intel 32位.hex格式,适用于ARM Cortex-M0。

评论

如何找到一部分固件代码存储设备密码?

#1 楼

一般先决条件

分析二进制文件时,重要的是能够将观察到的内容放入上下文中。例如,如何将CPU指令与非标准格式的二进制数据区分开?通常,这需要一些计算机系统的背景知识。我认为在进行反向工程固件的任何尝试之前,至少需要对以下概念有基本的了解:




计算机体系结构/计算机系统组织


CPU设计和功能(例如寄存器,指令指针,内存访问)
内存和内存层次结构
指令集,汇编,操作码,寻址模式,语法,助记符
信息表示(二进制,十六进制,字节序)



操作系统概念


虚拟内存
用户模式与内核模式,内核,内核接口(系统调用)
内存中的进程布局-堆栈,堆,数据,指令
可执行格式
应用程序二进制接口
程序入口点



源代码到目标代码的转换


编译,汇编,链接
C / C ++编程
汇编编程
从源到汇编构造公司关系(例如识别循环,组装中的开关构造)
反汇编与反编译



我的建议如下:


尽可能多地阅读:技术规范,组装/拆卸,固件RE问题解答,研究论文,教程,博客,教科书,手册页
模拟/复制专业人员使用的方法和采用的方法
尽快获得经验:查看并尝试许多不同类型的文件(可执行文件,图像文件,压缩文件,固件等),通过汇编程序进行使用,反汇编许多可执行文件

固件RE资源

Igor Skochinsky的“ PC反向器的嵌入式反向工程介绍
”概述了反向固件所涉及的内容,在“嵌入式​​设备安全性:固件反向工程”中,Jonas Zaddach和Andrei Costin概述了反向的一般方法。固件从幻灯片31开始。

看看专业人士给出的答案:


devttys0
ebux
Igor Skochinsky
6EQUJ5

这些可能有用或有趣:

devttys0的博客

ea的博客

Igor的博客

firmware.re
IOActive Labs研究博客
sviehb的博客

嵌入式系统通常使用MIPS或ARM处理器,并且扩展名为MIPS或ARM指令集。这意味着在分析这些系统的固件时,熟悉MIPS和ARM组装将非常有帮助。

分析二进制文件

第1部分:确定目标设备的体系结构

我们不能依靠传闻来获得分析固件所需的信息。必须使用经验证据来证明有关固件信息的有效性。仅从二手源获得二进制blob并从其他问题获得处理器名称是不够的。

1。确定目标设备

幸运的是,在这种情况下,至少很容易获得设备名称:SMOK X Cube II。当检查供应商的固件和工具支持页面时,发现存在具有该名称的真实设备。 .hex文件与台湾半导体制造商Nuvoton的升级工具捆绑在一起,称为“ NuMicro ISP编程工具”。设备处理器,而不是二手设备。它也是一个较新的版本-v1.098,而不是v1.07。我决定分析较旧的固件版本(v1.07),因为这是问题中的二进制版本。



2。标识处理器

图片中有一些有趣的东西用来描述升级过程:工具名称中的名称NuMicro和缩写ISP,术语DataFlash,对称为APROM的引用以及最重要的是,零件编号:NUC220LE3AN。这个数字是做什么用的? Nuvoton开发的基于ARM Cortex-M0处理器的微控制器。

3。确定指令集架构

Nuvoton可以自由地共享NuMicro NUC220系列的技术文档,包括数据表和技术参考手册,以及各种软件工具和培训资料(点击“ NUC220LE3AN产品页面顶部的“资源”选项卡)。

从数据表的第1节,“概述”,第7页(重点是我的):

/> NuMicro NUC200系列32位微控制器嵌入了最新的ARM®Cortex™-M0内核,其成本相当于用于工业控制和需要丰富通信接口的应用的传统8位MCU。 NuMicro NUC200系列包括NUC200和NUC220产品线。


这些信息是否足以得出结论,固件二进制文件中的代码包含32位ARM指令?不它不是。让我们仔细查看处理器的功能描述(第6章:功能描述,第1节:ARM Cortex-M0内核,第48页):




让我们特别注意以下信息:



该处理器可以执行Thumb代码,并且与其他Cortex®-M配置文件处理器兼容。


ARMv6-MThumb®指令集


Thumb-2技术


请注意处理器是ARM​​ Cortex-M0内核,而不是ARM Cortex-M0 +内核,后者具有不同的指令集。

摘自ARM Cortex-M0技术参考手册:


该处理器实现了ARMv6-M Thumb指令集,其中包括许多使用Thumb-2技术的32位指令。 ARMv6-M指令集包括:ARMv7-M中的所有16位Thumb指令(不包括CBZ,CBNZ和IT)
32位Thumb指令BL, DMB,DSB,ISB,MRS和MSR。



什么是“ Thumb代码”和“ Thumb指令集”?

来自“ Joe Lemieux(重点是我的)的ARM拇指简介”:


Thumb指令集由16位指令组成,这些指令充当

标准ARM的32位指令。每条Thumb指令都可以通过等效的32位ARM指令执行。但是,并非所有ARM
指令在Thumb子集中都可用。例如,
无法访问状态或协处理器寄存器。此外,某些只能在单个ARM指令中完成的功能
只能用一系列Thumb指令进行模拟。

此时,您可能会问为什么要有两个指令集在同一个CPU中?但是实际上ARM仅包含一个指令集:32位
集。当它在Thumb状态下运行时,处理器只需
将从内存中获取的较小的速记指令扩展为它们的32位等效项。

两个等效指令之间的区别在于
指令如何在执行之前获取和解释,而不是它们如何起作用。由于从16位到32位的扩展是通过芯片内的专用硬件完成的,因此它甚至不会降低执行速度。但是较窄的16位指令确实具有存储优势。

Thumb指令集提供了典型应用程序中所需的大多数功能。算术和逻辑运算,
支持加载/存储数据移动以及有条件和无条件分支
。根据可用的指令集,任何用C编写的代码都可以在Thumb状态下成功执行。但是,
设备驱动程序和异常处理程序通常必须至少部分地以ARM状态编写。


SO有一个很好的解释:ARM,Thumb和Thumb 2指令混乱

摘自《 ARMv6-M体系结构参考手册》第A5章:Thumb指令集编码,第1节:Thumb指令集编码,第82页:



另外:


NuMicro NUC200系列仅支持小端数据格式。




总结:固件二进制文件中的代码将由低端字节的16位ARM Thumb指令以及一些32位Thumb2指令组成,这些32位Thumb2指令将由实现ARM的32位ARM Cortex-M0处理器执行支持Thumb2的16位Thumb指令集。

4。确定设备的内存布局

通过访问技术参考手册,我们可以确定什么是APROM和ISP。从第6章:功能描述的第4.4.1节:闪存的组织,第191页:NuMicro NUC200系列闪存包括程序存储器(APROM),数据闪存,ISP加载器程序存储器(LDROM)和用户配置。程序存储器是用户应用程序的主存储器,称为APROM。用户可以将其应用程序写入APROM并设置系统以从APROM引导。

ISP加载程序程序存储器旨在供加载程序实现系统内编程功能。 LDROM独立于APROM,并且系统也可以设置为从LDROM引导。因此,用户可以使用LDROM来避免APROM代码损坏时系统引导失败。


从第6章:功能说明的第4.4.5节:系统内编程(ISP),第199页:ISP提供了更新板载系统固件的功能。各种外围接口使LDROM中的ISP加载程序可以轻松接收新的程序代码。执行ISP的最常见方法是通过UART和LDROM中的ISP加载器。一般来说,PC通过串行端口传输新的APROM代码。然后ISP加载程序接收它,并通过ISP命令重新编程到APROM中。


根据与NuMicro ISP编程工具捆绑在一起的config.ini文件中的信息,APROM段的闪存大小是128 KB:

~/firmware/e-cig/XCUBE II upgrading tool $ file *
config.ini:                                            ASCII text, with CRLF line terminators
NuMicro ISP Programming Tool.exe:                      PE32 executable (GUI) Intel 80386, for MS Windows
NuMicro ISP Programming Tool User's Guide.pdf:         PDF document, version 1.5
XCUBE II-VIVI-52 (160616)V.1.098(checksum=0x28F9).hex: ASCII text, with CRLF line terminators


这是闪存地址映射图:



我们知道从0x0000_0000到0x0001_FFFF的空间= 131071字节,即128 KB,这是使用升级工具将十六进制文件中的二进制文件闪存到的区域。除此之外,还有一个内存块,从0x0002_0000到0x0010_000,标记为“保留供进一步使用”。此“保留”空间的大小为0x0010_0000-0x0002_0000 = 0xE0000或917504字节。这几乎是1兆字节的保留空间。为APROM保留的128 KB占0x0000_0000和0x0010_0000之间的地址空间的12.5%,但表示为大于〜1 MB“保留”块。这很奇怪。在我可以找到的技术参考手册中,也没有任何有关此保留块的文档。如果可以物理访问该设备,则可能会转储并分析闪存的内容,以找出该区域中的内容。

由于固件二进制文件被写入保留给用户应用程序的闪存中的空间,因此固件二进制文件似乎不太可能包含内核代码,引导加载程序代码或文件系统。这与路由器固件不同,后者通常至少包含内核代码。

第2部分:直接分析二进制文件

快速回顾一下我们所了解的内容点:


设备名称-SMOK X Cube II
处理器-基于ARM Cortex-M0核心处理器的NuMicro NUC220LE3AN处理器
指令集体系结构-little-endian ARM-v6 M 16位Thumb
将固件写入闪存的位置-用户应用程序的128KB APROM区域(换句话说,不是内核)
NuMicro是一家台湾公司。我们将很快了解为什么这可能与之相关。
问题中包含的binwalk生成的熵图表明,固件中没有加密或压缩区域。
根据问题中包含的信息,存在文件中嵌入的ASCII字符串似乎与设备的功能有关

潜在的复杂性:


固件二进制文件没有像可执行文件这样的标准格式二进制文件确实可以将数据与二进制文件中的代码/指令混合在一起。在这种情况下,很可能会将诸如字符串之类的数据作为指令进行反汇编,从而导致对固件代码的错误表示

初步分析

1。 stringshexdump

字符串的输出可用于快速启发式确定固件是否已加密/压缩。如果输出中没有字符串,则可以很好地指示整个文件是否以某种方式混淆。带有-C参数的hexdump可用于为字符串提供一些上下文,即在二进制文件中它们相对于代码且相对于彼此。换句话说,这些字符串是打包在一起在一个块中,还是分散在整个二进制文件中?答案可以提供有关固件布局的线索。

使用hexump,我们看到ASCII字符串与可能的代码混合在一起:

$ cat config.ini | grep NUC200LE3AN -B2 -A3

[0x00020000]
NAME_STRING = NUC200LE3AN
RAM_SIZE = 16
FLASH_SIZE = 128


二进制文件中其他地方的另一组ASCII字符串:

00002ed0  01 21 1b 20 fd f7 6e fe  21 46 38 6a 09 f0 16 fd  |.!. ..n.!F8j....|
00002ee0  64 21 09 f0 13 fd 08 46  0a 21 09 f0 0f fd 10 30  |d!.....F.!.....0|
00002ef0  14 21 48 43 42 19 01 21  25 20 fd f7 5b fe 73 e0  |.!HCB..!% ..[.s.|
00002f00  68 e2 88 e0 57 41 54 54  0a 00 00 00 4d 4f 44 45  |h...WATT....MODE|
00002f10  0a 00 00 00 7c db 00 00  88 db 00 00 54 45 4d 50  |....|.......TEMP|
00002f20  0a 00 00 00 4d 45 4d 4f  52 59 0a 00 20 4d 4f 44  |....MEMORY.. MOD|
00002f30  45 20 0a 00 ac 01 00 20  53 54 52 45 4e 47 54 48  |E ..... STRENGTH|
00002f40  0a 00 00 00 3c 0b 00 20  20 4d 49 4e 20 0a 00 00  |....<..  MIN ...|
00002f50  53 4f 46 54 0a 00 00 00  4e 4f 52 4d 0a 00 00 00  |SOFT....NORM....|
00002f60  48 41 52 44 0a 00 00 00  20 4d 41 58 20 0a 00 00  |HARD.... MAX ...|
00002f70  ea cf 00 00 42 4c 55 45  54 4f 4f 54 48 0a 00 00  |....BLUETOOTH...|
00002f80  20 20 20 4f 4e 20 20 20  20 0a 00 00 20 20 20 4f  |   ON    ...   O|
00002f90  46 46 20 20 20 0a 00 00  ea d0 00 00 20 20 20 4c  |FF   .......   L|
00002fa0  45 44 20 20 20 0a 00 00  6a d1 00 00 53 54 45 41  |ED   ...j...STEA|
00002fb0  4c 54 48 0a 00 00 00 00  20 4f 46 46 20 20 0a 00  |LTH..... OFF  ..|
00002fc0  20 20 4f 4e 20 20 0a 00  20 20 54 4f 44 41 59 20  |  ON  ..  TODAY |
00002fd0  20 0a 00 00 80 96 98 00  f6 e1 00 00 83 e5 00 00  | ...............|
00002fe0  a0 86 01 00 10 27 00 00  21 46 38 6a 09 f0 8e fc  |.....'..!F8j....|
00002ff0  0a 21 09 f0 8b fc 10 31  14 20 41 43 4a 19 01 21  |.!.....1. ACJ..!|


其他地方的ASCII字符串:

00004f70  84 e0 04 f0 40 fe 00 28  13 d0 00 20 03 f0 ec ff  |....@..(... ....|
00004f80  1e 49 80 31 08 69 88 61  35 4a 90 42 00 d3 8c 61  |.I.1.i.a5J.B...a|
00004f90  88 69 08 62 33 48 06 23  04 22 00 90 19 46 00 20  |.i.b3H.#."...F. |
00004fa0  62 e0 6b e0 20 43 48 45  43 4b 20 20 0a 00 00 00  |b.k. CHECK  ....|
00004fb0  41 54 4f 4d 49 5a 45 52  0a 00 00 00 f6 e0 00 00  |ATOMIZER........|
00004fc0  28 03 00 20 ac 01 00 20  7a e0 00 00 20 20 43 48  |(.. ... z...  CH|
00004fd0  45 43 4b 20 20 0a 00 00  10 4b 00 00 ba e0 00 00  |ECK  ....K......|
00004fe0  44 4f 4e 27 54 0a 00 00  41 42 55 53 45 0a 00 00  |DON'T...ABUSE...|
00004ff0  50 52 4f 54 45 43 54 53  21 0a 00 00 3c 0b 00 20  |PROTECTS!...<.. |
00005000  20 57 41 54 54 20 0a 00  2c 2f 00 00 60 ea 00 00  | WATT ..,/..`...|
00005010  36 e1 00 00 2d 53 48 4f  52 54 2d 20 0a 00 00 00  |6...-SHORT- ....|
00005020  b2 eb 00 00 88 13 00 00  20 53 48 4f 52 54 20 20  |........ SHORT  |
00005030  0a 00 00 00 81 0b 00 00  49 53 20 4e 45 57 0a 00  |........IS NEW..|
00005040  43 4f 49 4c 3f 20 0a 00  59 0a 00 00 4e 0a 00 00  |COIL? ..Y...N...|
00005050  7c db 00 00 88 db 00 00  dc 05 00 00 a0 db 00 00  ||...............|
00005060  0f 27 00 00 94 db 00 00  fb f7 e0 fd 28 46 fd f7  |.'..........(F..|
00005070  a1 f8 fb f7 f0 fe 07 20  fd f7 08 fb af 20 fb f7  |....... ..... ..|
00005080  2f ff 00 20 fb f7 30 ff  38 bd ff 49 08 60 70 47  |/.. ..0.8..I.`pG|
00005090  fe 49 88 72 70 47 fd 48  80 7a 70 47 10 b5 13 24  |.I.rpG.H.zpG...$|


文件的不同部分中还有更多此类ASCII字符串簇。产品手册中提到了一些ASCII字符串:



但是,手册中并未提及二进制中的许多ASCII字符串,例如:

00005490  44 2f 00 00 34 0c 00 20  a0 db 00 00 88 db 00 00  |D/..4.. ........|
000054a0  94 db 00 00 7c db 00 00  ea d5 00 00 36 0a 00 00  |....|.......6...|
000054b0  2e 0a 00 00 50 4f 57 45  52 0a 00 00 20 4f 46 46  |....POWER... OFF|
000054c0  20 0a 00 00 20 20 4f 4e  20 0a 00 00 e7 03 00 00  | ...  ON .......|
000054d0  0f 27 00 00 9f 86 01 00  33 08 00 00 5f db 00 00  |.'......3..._...|
000054e0  fb f7 a4 fb fd 49 20 68  07 f0 10 fa 7d 27 08 46  |.....I h....}'.F|
000054f0  ff 00 39 46 07 f0 0a fa  f9 4e 00 01 80 19 01 22  |..9F.....N....."|


二进制文件的可视化还显示,落入ASCII范围内的字节序列分散在整个二进制文件中(蓝色为ASCII):



2。考虑到语言环境,开发了固件

固件,升级工具和微控制器都是由台湾公司Nuvoton开发的。也许二进制文件中也有繁体中文字符序列。

默认情况下,strings搜索ASCII字符序列,hexdump的-C选项将ASII范围内的字节打印为ASCII字符。但是,如果二进制文件中除了ASCII编码的字符串之外还有Unicode编码的字符串怎么办? Radare2可用于直接在hex文件中搜索字符串,而不必依赖于其他工具的输出(hexdump非常灵活,但使用radare2更快。)要搜索字符串,将使用izz命令在整个二进制文件中搜索字符串:

00009d00  21 b0 f0 bd 00 01 00 50  00 ff 01 00 b4 ed 00 00  |!......P........|
00009d10  43 12 67 00 45 52 52 4f  52 3a 20 20 20 0a 00 00  |C.g.ERROR:   ...|
00009d20  4e 4f 20 53 45 43 52 45  54 0a 00 00 2d 4b 45 59  |NO SECRET...-KEY|
00009d30  21 20 20 20 20 0a 00 00  ef 48 00 68 c0 07 c0 0f  |!    ....H.h....|


这会产生一些潜在的有趣结果:

$ r2 ihex://SMOK_X_CUBE_II_firmware_v1.07.hex
 -- I am Pentium of Borg. Division is futile. You will be approximated.
[0x00000000]> izz
Do you want to print 1444 lines? (y/N)   <--- enter "y", obviously


我无法阅读这些字符,因此我不知道它们是哪种语言。也许只是胡言乱语。

3。使用十六进制编辑器

带有GUI的十六进制编辑器可用于快速搜索数据中的模式。例如,字节0A看起来像是用作ASCII字符串的终止字符:



反汇编

那么二进制应该怎么做?用r2拆卸? 16位ARM Thumb指令+一些32位Thumb2指令是否有任何特殊参数或命令?

从如何拆卸到ARM UAL ?:


-b16被假定为拇指,而不是因为指令大小或寄存器大小。使事情变得更简单是一个例外。因为它的
只是cpu的一种模式。

-b16在capstone反汇编程序(以及gnu)中设置thumb2模式。 Thumb2包含2个字节和4个字节的指令长度。 Thumb仅是
2。但是thumb和thumb2是Binarynl兼容的,因此除非CPU不支持,否则在这里使用thumb2是有意义的。仅仅是语法,
该语法就可以在capstone中使用。

Capstone对代码或数据一无所知。它只是在拆卸。


为了正确地反汇编文件,关键是要指定正确的体系结构:


-b位强制asm.bits(16,32,64)


对于此固件二进制文件,应使用-b 16而不是-b 32: r2由于未对齐而读为无效:


作为参考,这里是从相同偏移$ r2 -a arm -b 16 ihex://SMOK_X_CUBE_II_firmware_v1.07.hex开始的反汇编,具有正确的16位对齐:



显然这是完全不同的。

要分析反汇编的代码,必须熟悉ARM Thumb指令集和汇编,并且可能更熟悉ARM(CPU设计) ,寄存器等)。 Azeria Labs系列教程似乎是一个很好的起点。

其他注意事项


ISP升级工具是MS Windows PE32可执行二进制文件。可以对它进行反向工程以确定刷新过程的发生方式。
物理访问微控制器可能会有用。闪存的全部内容可以转储和分析。这也将使人们能够准确地了解如何将所有内容布置在闪存中。
如果可以隔离已知的良好代码块,则可以对其进行反编译

结论

希望这里使用的方法对将来的固件RE努力很有用。由于分析固件与要嵌入其中的硬件之间的紧密关系,因此分析固件面临着一系列挑战。由于设备的设计和体系结构决定了固件的布局和内容,因此,有时如果无法访问固件就无法进行反向操作。到设备,或者至少了解设备的指令集架构。