固件手动提取

信息收集

识别归档文件、架构、内核
通过固件厂商寻找已有的解密方法、自定义签名、魔数等

同时需要看固件是不是从NAND Flash中直接dump出来的,如果是先要用nanddump提取,当然也可能提取失败,这里只写dd提取

dd if=<固件DUMP文件> of=<输出.bin文件> ibs=<页大小+OOB大小> obs=<页大小> conv=sync,noerror

定位

使用hexdump、grep之类的工具,通过信息收集到的或者魔数库中的魔数,确定偏移量,例如:

hexdump -C firmware.bin | grep -E 'hsqs|sqsh|Hdrs|85 19|19 85|5D 00 00'

或者也可以单纯用grep,但个人觉得搜十六进制字节没有上面方便

grep -abo 'hsqs' firmware.bin
grep -abo $'\x85\x19' firmware.bin

找到地址后计算偏移量

提取

使用dd指令提取出压缩文件或文件系统,这里块大小(bs)设置为1字节就好:

dd if=<固件文件> of=<目标文件> bs=1 skip=<前一步找到的偏移量>

压缩文件(例如LZMA),则使用相应命令进行解密

lzma -d firmware.lzma

之后用文件系统解压工具提取出所有的文件,每种文件系统有不同的工具

文件系统 解压工具 命令示例
SquashFS unsquashfs unsquashfs -d <输出目录> <镜像文件>
CramFS cramfsck cramfsck -x <输出目录> <镜像文件>
JFFS2 jefferson jefferson -i <镜像文件> -o <输出目录>
Ext2/3/4 debugfs debugfs -R 'rdump / <输出目录>' <镜像文件>

解压工具建议手动编译,方便替换自定义魔数

固件解密

固件解密主要有两个条件:

  1. 一般会有unpack函数,这个函数大概率会在加密版本前一个历史版本中
  2. 其中或许有nonce文件或者字符串,这个字符串主要用于解密出真实固件

一个仍在爬山的人