binwalk笔记

14 篇文章 3 订阅


源码仓库:https://github.com/ReFirmLabs/binwalk

Gitee镜像:https://gitee.com/mirrors/Binwalk

Wiki: https://github.com/ReFirmLabs/binwalk/wiki

集成工具firmware-mod-kit,感觉不太好用,随便从dlink上下了一个固件,binwalk可以提取,fmk的extract-firmware.sh却不能识别文件系统。

1. 一些基础知识

固件

固件里包含操作系统的内核和文件系统。固件不是硬件,而是软件,名称的由来是它被固化在可编程可擦除只读存储器(EPROM,或EPPROM)中。

OpenWRT镜像的发布站点目录中存在两种类型的固件:

  • factory原厂固件;
  • sysupgrade固件,之前称之为TRX镜像。

可以参考下面的OpenWRT固件列表:

[OpenWrt Wiki] Table of Hardware: Firmware downloads

Factory固件用来刷机;Sysupgrade固件用来升级。

Factory固件预留原厂分区, 包括数据分区;Sysupgrade固件只包含openwrt分区。

factory固件多一层文件头和md5验证。

有一个公式:

factory.bin = sysupgrade.bin
+空闲空间
+系统的配置空间

复习一下Linux

复习一下linux上vmlinux、Image、uImage、zImage这几个名词。

Linux内核经过编译后会生成一个ELF格式的可执行程序,叫vmlinux或vmlinuz

为了节省空间,把vmlinuz制作成image镜像。这时已经可以烧录了,但image还是不小,于是进一步压缩,在文件头添加加压缩代码,这个压缩后的镜像就叫做zimage


U-boot 是嵌入式系统的内核引导加载程序,u-boot 启动过程分为两个部分 :

  1. Stage1,用汇编语言来实现,文件start.s,用于初始化硬件设备,最主要的功能就是把ROM中的Stage2 加载到RAM中去;
  2. Stage2,用C语言实现,文件lib_arm/board.c,是整个u-boot(armboot)的主函数,完成一系列初始化操作。

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;

2. 安装

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

3. 命令行用法

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

Diff

-W  # 可以指定多个bin

压缩

-P  # 可以提高--lzma扫描的速度

其它通用选项

可搭配以上几类参数使用。

-f FILE -c # 指定日志文件 格式csv
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值