很多时候我们都有对固件进行提取、修改的需要。本章就对固件提取做一个详细的介绍
0x1 flash芯片
- 嵌入式设备中保存固件的芯片称之为flah芯片也成为ic
- 虽然可以免拆读取芯片,但是效果一般都很差,建议拆下来读取
0x1.1 芯片特征
- 嵌入式设备中常见 8角以及16角的 flash芯片
- 芯片上一般都会刻有logo和信号,通过网络搜索来判定是不是flash芯片
0x1.2 flash芯片分类
- 路由器使用的一般是廉价的低成本的 flash 芯片
- 根据制作工艺不同,一般将flash芯片分成三类
- 不同类型的 flash芯片 需要使用 不同的 方式去读取
0x1.2.1 NOR FLASH
- NOR Flash是一种非易失闪存技术,是Intel在1988年创建
- 最稳定,针脚最多,容量最小,体积最大
- 容量一般为8~16M,极个别厂商能做到100M+
- 目前嵌入设备选用的 NOR FLASH 一般是 48/56 角
- 早期的产品一般都会选用 这个方案
0x1.2.2 NAND FLASH
- 相比于 NOR FLASH 会出现更多的坏块,嵌入式设备一般不会采用
- 价格较贵,容量一般为8~256M
- 目前嵌入设备选用的 NAND FLASH 一般是 48 角
- 很少有嵌入式设备会选用这个 方案
- 华硕 比较喜欢用这个
0x1.2.3 SPI FLASH
- SPI FLASH 是 一种特殊的封装方式,可以 基于 NOR FLAH 或者 NAND FLASH 来实现
- 比 NAND FLASH 稳定,价格也比 NAND FLASH 低
- 容量一般为 8~32 M
- 目前嵌入设备选用的 SPI FLASH 一般是 8/16 角
- 大多数嵌入式设备都会选取这个方案
8角 spi flash
16角的 spi flash
0x2 观察设备
- 首先观察路由器
- 获取到路由器的型号,通过网络搜索获取到一些配置信息
这是本次实验的受害者,一台h3c的路由器
正面:
反面:
0x3 观察主板
在上一步中对路由器有一个基础的了解后,接下来直接对路由器的主板进行分析
主板正面:
主板背面:
0x4 定位flash芯片
- 观察到主板上有大量的 8角以及16角的芯片
- 通过之前对路由器配置的查询,这台路由器的flash应该是16M左右
- 16M的flash芯片会比较大,一般不会是8角的芯片
配合 芯片的 logo/型号 基本锁定了 flash芯片是下面这颗芯片
接下来使用 热风枪 将flash芯片拆下来即可
0x5 读取固件
通过之前的准备工作已经获得了目标 flah芯片,接下来只需要利用软件读出其中的数据即可
0x5.1 打开编程器
- 编程器有很多选择
- 这里选择一款国产的编程器 809F
- 这是编程器对应的软件
0x5.2 链接flash
- 这一步主要是将flash芯片连接到 编程器专用的 设备上
- 最后通过usb连接到电脑
- flash芯片会在某一个脚上做上特殊的标志,一定要放上面
0x5.3 识别固件
- 到目前为止已经将 flash芯片通过 专有设备 连接到软件中
- 但是每一个 flash的 读取方式都是不同的
- 这里可以利用软件的自动识别来确定型号
- 如果无法自动识别出型号,那么只能手动选择 flash芯片的型号
点击自动识别:
自动识别出固件型号:
0x5.4 读取数据
- 识别出固件型号后就可以读取 flash芯片中的数据了
- 读取成功后会自动 弹窗提醒用户保存固件
读取数据:
保存固件到文件中:
0x6 解包固件
- 目前为止 已经提取到了目标flash芯片中的数据
- 接下来使用
binwalk
之类的软件读取固件系统即可
分析固件格式
root@ub18-dev:~# binwalk MX25L12805D@SOP16_20200401_141441.BIN
DECIMAL HEXADECIMAL DESCRIPTION
--------------------------------------------------------------------------------
1024 0x400 U-Boot version string, "U-Boot 1.1.4 (2016-03-18 - 10:48:02)H3C"
164128 0x28120 CRC32 polynomial table, big endian
262484 0x40154 7-zip archive data, version 0.2
1059192 0x102978 U-Boot version string, "U-Boot 1.1.4 (2016-03-18 - 10:48:02)H3C"
1224344 0x12AE98 CRC32 polynomial table, big endian
1246964 0x1306F4 7-zip archive data, version 0.2
1400248 0x155DB8 U-Boot version string, "U-Boot 1.1.4 (2016-11-03 - 08:47:58)H3C"
1521096 0x1735C8 CRC32 polynomial table, big endian
1540396 0x17812C 7-zip archive data, version 0.2
1678680 0x199D58 7-zip archive data, version 0.2
3578998 0x369C76 MySQL ISAM compressed data file Version 3
可以看到有4个7z的压缩数据,这里利用dd 提取出来
dd if=MX25L12805D@SOP16_20200401_141441.BIN of=h3c1.7z bs=1 seek=262484 count=796708
dd if=MX25L12805D@SOP16_20200401_141441.BIN of=h3c2.7z bs=1 seek=1246964 count=153284
dd if=MX25L12805D@SOP16_20200401_141441.BIN of=h3c3.7z bs=1 seek=1540396 count=138284
dd if=MX25L12805D@SOP16_20200401_141441.BIN of=h3c4.7z bs=1 seek=1678680 count=1900318