很多时候我们都有对固件进行提取、修改的需要。本章就对固件提取做一个详细的介绍

0x1 flash芯片

  1. 嵌入式设备中保存固件的芯片称之为flah芯片也成为ic
  2. 虽然可以免拆读取芯片,但是效果一般都很差,建议拆下来读取

0x1.1 芯片特征

  1. 嵌入式设备中常见 8角以及16角的 flash芯片
  2. 芯片上一般都会刻有logo和信号,通过网络搜索来判定是不是flash芯片

0x1.2 flash芯片分类

  1. 路由器使用的一般是廉价的低成本的 flash 芯片
  2. 根据制作工艺不同,一般将flash芯片分成三类
  3. 不同类型的 flash芯片 需要使用 不同的 方式去读取

0x1.2.1 NOR FLASH

  1. NOR Flash是一种非易失闪存技术,是Intel在1988年创建
  2. 最稳定,针脚最多,容量最小,体积最大
  3. 容量一般为8~16M,极个别厂商能做到100M+
  4. 目前嵌入设备选用的 NOR FLASH 一般是 48/56 角
  5. 早期的产品一般都会选用 这个方案

s-l500.jpg

0x1.2.2 NAND FLASH

  1. 相比于 NOR FLASH 会出现更多的坏块,嵌入式设备一般不会采用
  2. 价格较贵,容量一般为8~256M
  3. 目前嵌入设备选用的 NAND FLASH 一般是 48 角
  4. 很少有嵌入式设备会选用这个 方案
  5. 华硕 比较喜欢用这个

image-20200402151511326.png

0x1.2.3 SPI FLASH

  1. SPI FLASH 是 一种特殊的封装方式,可以 基于 NOR FLAH 或者 NAND FLASH 来实现
  2. 比 NAND FLASH 稳定,价格也比 NAND FLASH 低
  3. 容量一般为 8~32 M
  4. 目前嵌入设备选用的 SPI FLASH 一般是 8/16 角
  5. 大多数嵌入式设备都会选取这个方案

8角 spi flash

image-20200402152025401.png

16角的 spi flash

image-20200402152635093.png

0x2 观察设备

  1. 首先观察路由器
  2. 获取到路由器的型号,通过网络搜索获取到一些配置信息

这是本次实验的受害者,一台h3c的路由器

正面:

IMG20200401142508.jpg

反面:

IMG20200401142516.jpg

0x3 观察主板

在上一步中对路由器有一个基础的了解后,接下来直接对路由器的主板进行分析

主板正面:

IMG20200401142541.jpg

主板背面:

IMG20200401142639.jpg

0x4 定位flash芯片

  1. 观察到主板上有大量的 8角以及16角的芯片
  2. 通过之前对路由器配置的查询,这台路由器的flash应该是16M左右
  3. 16M的flash芯片会比较大,一般不会是8角的芯片

配合 芯片的 logo/型号 基本锁定了 flash芯片是下面这颗芯片

IMG20200401134921.jpg

接下来使用 热风枪 将flash芯片拆下来即可

IMG20200401144333.jpg

0x5 读取固件

通过之前的准备工作已经获得了目标 flah芯片,接下来只需要利用软件读出其中的数据即可

0x5.1 打开编程器

  1. 编程器有很多选择
  2. 这里选择一款国产的编程器 809F
  3. 这是编程器对应的软件

1 打开编程器软件.png

0x5.2 链接flash

  1. 这一步主要是将flash芯片连接到 编程器专用的 设备上
  2. 最后通过usb连接到电脑
  3. flash芯片会在某一个脚上做上特殊的标志,一定要放上面

IMG20200401140626.jpg

0x5.3 识别固件

  1. 到目前为止已经将 flash芯片通过 专有设备 连接到软件中
  2. 但是每一个 flash的 读取方式都是不同的
  3. 这里可以利用软件的自动识别来确定型号
  4. 如果无法自动识别出型号,那么只能手动选择 flash芯片的型号

点击自动识别:

2 点击自动识别.png

自动识别出固件型号:

3 识别出固件存储芯片.png

0x5.4 读取数据

  1. 识别出固件型号后就可以读取 flash芯片中的数据了
  2. 读取成功后会自动 弹窗提醒用户保存固件

读取数据:

4 读取芯片中的数据.png

保存固件到文件中:

5 保存固件.png

0x6 解包固件

  1. 目前为止 已经提取到了目标flash芯片中的数据
  2. 接下来使用 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
Last modification:February 3, 2021
如果觉得我的文章对你有用,请随意赞赏