固件手动提取
信息收集
识别归档文件、架构、内核
通过固件厂商寻找已有的解密方法、自定义签名、魔数等
同时需要看固件是不是从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 / <输出目录>' <镜像文件> |
解压工具建议手动编译,方便替换自定义魔数
固件解密
固件解密主要有两个条件:
- 一般会有unpack函数,这个函数大概率会在加密版本前一个历史版本中
- 其中或许有nonce文件或者字符串,这个字符串主要用于解密出真实固件