Gitee镜像:https://gitee.com/mirrors/Binwalk
Wiki: https://github.com/ReFirmLabs/binwalk/wiki
集成工具firmware-mod-kit,感觉不太好用,随便从dlink上下了一个固件,binwalk可以提取,fmk的extract-firmware.sh却不能识别文件系统。
固件里包含操作系统的内核和文件系统。固件不是硬件,而是软件,名称的由来是它被固化在可编程可擦除只读存储器(EPROM,或EPPROM)中。
OpenWRT镜像的发布站点目录中存在两种类型的固件:
可以参考下面的OpenWRT固件列表:
[OpenWrt Wiki] Table of Hardware: Firmware downloads
Factory固件用来刷机;Sysupgrade固件用来升级。
Factory固件预留原厂分区, 包括数据分区;Sysupgrade固件只包含openwrt分区。
factory固件多一层文件头和md5验证。
有一个公式:
factory.bin = sysupgrade.bin
+空闲空间
+系统的配置空间
复习一下linux上vmlinux、Image、uImage、zImage这几个名词。
Linux内核经过编译后会生成一个ELF格式的可执行程序,叫vmlinux或vmlinuz。
为了节省空间,把vmlinuz制作成image镜像。这时已经可以烧录了,但image还是不小,于是进一步压缩,在文件头添加加压缩代码,这个压缩后的镜像就叫做zimage。
U-boot 是嵌入式系统的内核引导加载程序,u-boot 启动过程分为两个部分 :
UImage是为了配合uboot而发明的一种镜像格式,mkimage工具可以将zImage加工成uImage。
加工过程其实就是在zImage前面加上64字节的uImage的头信息:
/*
* Legacy format image header,
* all data in network byte order (aka natural aka bigendian).
*/
typedef struct image_header {
uint32_t ih_magic; /* Image Header Magic Number */
uint32_t ih_hcrc; /* Image Header CRC Checksum */
uint32_t ih_time; /* Image Creation Timestamp */
uint32_t ih_size; /* Image Data Size */
uint32_t ih_load; /* Data Load Address */
uint32_t ih_ep; /* Entry Point Address */
uint32_t ih_dcrc; /* Image Data CRC Checksum */
uint8_t ih_os; /* Operating System */
uint8_t ih_arch; /* CPU architecture */
uint8_t ih_type; /* Image Type */
uint8_t ih_comp; /* Compression Type */
uint8_t ih_name[IH_NMLEN]; /* Image Name */
} image_header_t;
Kali已经预装好了,可以直接用。
Wiki上只是执行了以下指令,先卸载(旧版本)再安装:
sudo python setup.py uninstall && sudo python setup.py install)
但之后,还需要安装各种解压插件,才能解压出固件中各种各样的文件系统。可以参考INSTALL.md。
Debian 系统可以用依赖安装脚本更换提取工具,比较慢:
sudo ./deps.sh
下面是INSTALL.md中的安装脚本:
#!/bin/bash
#dependencies
sudo apt -y install python-lzma python-crypto
sudo apt -y install libqt4-opengl python-opengl python-qt4 python-qt4-gl python-numpy python-scipy python-pip
sudo pip install pyqtgraph
sudo pip install capstone
# Install standard extraction utilities
sudo apt -y install mtd-utils gzip bzip2 tar arj lhasa p7zip p7zip-full cabextract cramfsswap squashfs-tools sleuthkit default-jdk lzop srecord
#Install binwalk
#sudo apt-get install binwalk
cd binwalk
sudo python setup.py install
cd ..
# Install sasquatch to extract non-standard SquashFS images
sudo apt -y install zlib1g-dev liblzma-dev liblzo2-dev
cd sasquatch && sudo ./build.sh
cd ..
# Install jefferson to extract JFFS2 file systems
sudo pip install cstruct
cd jefferson && sudo python setup.py install
cd ..
# Install ubi_reader to extract UBIFS file systems
sudo apt -y install liblzo2-dev python-lzo
cd ubi_reader && sudo python setup.py install
cd ..
# Install yaffshiv to extract YAFFS file systems
cd yaffshiv && sudo python setup.py install
cd ..
#install unstuff (closed source) to extract StuffIt archive files
sudo cp stuff/bin/unstuff /usr/local/bin/
如果有些依赖下载失败,就手动搞吧:
# https://github.com/devttys0/sasquatch
./build.sh
# https://github.com/jrspruitt/ubi_reader
cd ubi_reader && $SUDO $PYTHON setup.py install
# or
sudo python -m pip install ubi_reader
# https://github.com/npitre/cramfs-tools
cd cramfs-tools \
&& make \
&& sudo install mkcramfs /usr/local/bin \
&& sudo install cramfsck /usr/local/bin
安装、卸载IDA插件:
python setup.py idainstall --idadir=/home/user/ida
python setup.py idauninstall --idadir=/home/user/ida
Wiki: Binwalk Command Line Usage
帮助信息很详细,只记一下常用的几个。
-Y # 识别指令集架构 比如路由器一般时mips
Signature Scan.
# 扫描(签名),相当于-B --signature
binwalk firmware.bin
# 搜索字符串
$ binwalk -R "\x61\x62\x63" FW113CNB05.bin
DECIMAL HEXADECIMAL DESCRIPTION
--------------------------------------------------------------------------------
10026 0x272A Raw signature (\x61\x62\x63)
# 可执行代码
-A
# 过滤
-y filesystem # 只显示文件系统相关的信息
-x mach-o # 排除OSX mach-o信息
# 完整结果,当觉得binwalk把有效信息当成无效信息时使用
-I
# 提取
binwalk -e firmware.bin
# 指定-e或-dd是,可以用-M递归,-d指定深度
# 一般用-Me
binwalk -Me firware.bin
# 文件类型
# %e将替换为解压缩文件的相对路径
binwalk -D 'zip archive:zip:unzip %e' -D 'png image:png' firmware.bin
-E
-W # 可以指定多个bin
-P # 可以提高--lzma扫描的速度
可搭配以上几类参数使用。
-f FILE -c # 指定日志文件 格式csv