前言
binwalk:https://github.com/ReFirmLabs/binwalk
首先我们需要安装固件提取工具 binwalk,由于该工具的安装流程比较繁琐,建议直接使用Kali Linux,该系统默认安装有 binwalk。
这里我们选择Kali自带的binwalk工具。。。。
固件分析初探
binwalk提取固件命令
binwalk -t -vv -e 固件文件名
提取固件系统的参数是-e,加上-t -vv
参数可以查看详细的提取过程。
其他binwalk命令格式如下:
用法: binwalk [选项] [文件1] [文件2] [文件3] ...
文件签名扫描选项:
-B, --signature 使用常见的文件签名扫描目标文件
-R, --raw=<str> 使用指定字节序列扫描目标文件
-A, --opcodes 使用普通可执行操作码签名扫描目标文件
-m, --magic=<file> 使用指定的特殊格式文件
-b, --dumb 禁用智能签名关键字
-I, --invalid 显示标记为无效的结果
-x, --exclude=<str> 排除与str相匹配的结果
-y, --include=<str> 只显示与str相匹配的结果
提取选项:
-e, --extract 自动提取已知的文件类型
-D, --dd=<type:ext:cmd> 提取类型的签名<type>, 文件扩展名为 <ext>, 执行的命令 <cmd>
-M, --matryoshka 递归扫描提取文件
-d, --depth=<int> 限制-M递归的范围 (默认值: 8次)
-C, --directory=<str> 提取文件或文件夹至指定文件夹 (默认值: 当前工作文件夹)
-j, --size=<int> 限制每个提取文件的大小
-n, --count=<int> 限制提取文件的数量
-r, --rm 清除在提取过程中提取工具无法处理的零大小文件。
-z, --carve 从文件中切割数据,但是不执行提取程序
熵分析选项:
-E, --entropy 计算文件熵
-F, --fast 使用快速但是不详细的熵分析
-J, --save 自动将由-E生成的的熵图保存为PNG文件而不是直接显示。
-Q, --nlegend 将熵图的说明省略
-N, --nplot 不生成熵图
-H, --high=<float> 设置上升边缘熵触发阈值 (默认值: 0.95)
-L, --low=<float> 设置下降边缘熵触发阈值 (默认值: 0.85)
二进制比较选项:
-W, --hexdump 执行输入文件的十六进制转储(s)和颜色编码区分:绿色—这些字节在所有文件中都是相同的。红色-这些字节在所有文件中都是不同的。蓝色—这些字节在某些文件中是不同的。
-G, --green 只显示在所有文件中都相同的字节所在的行
-i, --red 只显示在所有文件中都不相同的字节所在的行
-U, --blue 只显示在某些文件中都不相同的字节所在的行
-w, --terse 比较所有文件,但是只显示第一个文件的16进制转储
原始压缩选项:
-X, --deflate 用蛮力识别可能的原始压缩数据流
-Z, --lzma 扫描原始LZMA压缩流
-P, --partial 只使用常用的压缩选项搜索压缩流,速度快。
-S, --stop 在获得第一个结果后停止
通用选项:
-l, --length=<int> 需扫描的字节数
-o, --offset=<int> 跳过文件偏移量开始扫描
-O, --base=<int> 为所有的打印结果偏移量增加一个基址
-K, --block=<int> 设置文件块大小
-g, --swap=<int> 在扫描前每n字节反转一次
-f, --log=<file> 把结果记录到文件
-c, --csv 把结果记录到CSV文件中
-t, --term 格式化输出,已使用终端窗口
-q, --quiet 禁用输出到标准输出
-v, --verbose 启用详细输出,包括目标文件MD5和扫描时间戳。
-h, --help 显示帮助信息
-a, --finclude=<str> 只扫描文件名匹配正则表达式的文件
-p, --fexclude=<str> 不扫描文件名匹配正则表达式的文件
-s, --status=<int> 在指定端口启动状态服务器
这里我们选择华硕RT-N300路由器的固件,binwalk直接提取即可。
提取出来的文件夹为_RT-N300_3.0.0.4_378_9317-g2f672ff.trx.extracted
,其中的squashfs-root
就是我们想要的该固件的文件系统。通过输出信息,可以得知该固件系统没有加密压缩,且系统为Squashfs
。
binwalk提取原理分析
binwalk提取文件原理就是,通过自带的强大的magic特征集,扫描固件中文件系统初始地址的特征码,若匹配成功,则将该段数据dump下来,这个magic特征集已公开。
以这个固件为例,是Squashfs文件系统,对应的扫描特征码为hsqs。
我们可以做个实验,使用hexdump搜索hsqs的地址,为0xe20c0,这个就是文件系统的初始地址。
hexdump -C RT-N300_3.0.0.4_378_9317-g2f672ff.trx | grep -i 'hsqs'
使用dd命令截取地址925888(0xe20c0)之后的数据,保存到rt-n300-fs。
dd if=RT-N300_3.0.0.4_378_9317-g2f672ff.trx bs=1 skip=925888 of=rt-n300-fs
最后,使用unsquashfs rt-n300-fs命令解析rt-n300-fs文件,得到的squashfs-root就是固件系统,这个跟上述binwalk提取的那个是一样的。
unsquashfs rt-n300-fs