前言
本周一安恒萌新粉丝群:928102972
分享的工具为binwalk
。Binwalk
是一款快速、易用,用于分析,逆向工程和提取固件映像的工具。简单易用,完全自动化脚本,并通过自定义签名,提取规则和插件模块,还重要一点的是可以轻松地扩展。
在CTF的MISC类题型和IOT安全的固件解包分析中广泛应用,可以大大提高效率。该工具对linux支持较好,对于windows功能支持较差,有条件的童鞋可以在linux上使用练习该神器。
BinWalk安装部署
binwalk
github项目:https://github.com/ReFirmLabs/binwalkbinwalk
的wiki:https://github.com/devttys0/binwalk/wikibinwalk
是一款python
编写的工具,目前python2.x
和python3.x
都较好的支持,不过在Python3.x
中运行速度更快。在kali
里面已经预装了,在其他发行版linux
中安装也很简单,不过在windows
上会稍微繁琐一些。windows
下的安装和使用方法可以参考pcat
大表哥的方法https://www.cnblogs.com/pcat/p/5256288.html。wiki
上对于安装使用已经说的非常详细了。建议英文好的童鞋可以直接看官方的资料。网上资料也很多,这里就简单的翻译总结一下。
这里使用kali linux
演示(基于Debian的linux发行版开发的一个渗透数字取证的系统)
注意: 如果原来系统已经安装了旧版binwalk
,这里建议先卸载再安装新版本,以防止出现不兼容和API冲突等问题。1
2
3
4
5
6
7
8 sudo su //如果不是root账号建议先获取root权限,防止出现权限不足的问题
binwalk //直接运行查看已经安装binwalk的版本(最新版是v2.1.1,kali 2018里预载的是最新版,如果是1.0运行下面命令,否则可以直接跳过)和各参数的介绍
sudo apt-get remove binwalk //卸载binwalk
sudo apt-get update //更新软件列表
git clone https://github.com/ReFirmLabs/binwalk //获取binwalk源码
cd binwalk //进入binwalk文件夹
sudo python setup.py install //Binwalk遵循标准的Python安装过程
sudo apt-get install python-lzma //如果运行的是Python 2.x,强烈建议安装可选的Python lzma模块(但不是必需的),python3中已经包含
如果执行命令的中途出现了无法获得锁 /var/lib/dpkg/lock - open (11: 资源暂时不可用) ubuntu 安装vim 及遇到的错误处理
,执行下面命令:1
2sudo rm /var/cache/apt/archives/lock //如果是root账号可以去掉sudo
sudo rm /var/lib/dpkg/lock
binwalk
还需要安装一些依赖项,具体的大家可以去Wilk
上查看,如果是Debian / Ubuntu
源代码里已经给了一键自动安装依赖项的脚本,运行命令:1
2
3
4
5
6 sudo ./deps.sh //切换到binwalk目录下
```
## 安装IDA插件
`binwalk`还可以安装`binwalk IDA`插件,这个功能对于做固件逆向的功能是非常方便的。安装:
```shell
python setup.py idainstall --idadir = / home / user / ida
卸载:1
python setup.py idauninstall --idadir = / home / user / ida
参数介绍使用
显示binwalk帮助输出(`-h, –help)
1 | binwalk --help |
扫描固件
binwalk
的主要功能 - 也是迄今为止最受欢迎的功能。Binwalk
可以扫描许多不同嵌入式文件类型和文件系统的固件映像,只需给它一个要扫描的文件列表:1
2
3
4
5
6
7
8 binwalk firmware.bin
DECIMAL HEX DESCRIPTION
-------------------------------------------------------------------------------------------------------------------
0 0x0 DLOB firmware header, boot partition: "dev=/dev/mtdblock/2"
112 0x70 LZMA compressed data, properties: 0x5D, dictionary size: 33554432 bytes, uncompressed size: 3797616 bytes
1310832 0x140070 PackImg section delimiter tag, little endian size: 13644032 bytes; big endian size: 3264512 bytes
1310864 0x140090 Squashfs filesystem, little endian, version 4.0, compression:lzma, size: 3264162 bytes, 1866 inodes, blocksize: 65536 bytes, created: Tue Apr 3 04:12:22 2012
文件提取(-e,--extract
)
这个功能也是一个常用的功能,在CTF中很多文件分解的misc题
都可以使用binwalk
提高效率相对于使用winhex
这类工具。
可以使用-e
选项提取它在固件映像中找到的任何文件。1
$ binwalk -e firmware.bin
签名分析(-B,--signature
)
对目标文件执行签名分析,如果未指定其他分析选项,则这是默认值。
如果希望将签名分析与其他分析器(例如 - 熵)结合使用,请使用此选项:1
2
3
4
5
6
7
8 binwalk --signature firmware.bin
DECIMAL HEX DESCRIPTION
-------------------------------------------------------------------------------------------------------------------
0 0x0 DLOB firmware header, boot partition: "dev=/dev/mtdblock/2"
112 0x70 LZMA compressed data, properties: 0x5D, dictionary size: 33554432 bytes, uncompressed size: 3797616 bytes
1310832 0x140070 PackImg section delimiter tag, little endian size: 13644032 bytes; big endian size: 3264512 bytes
1310864 0x140090 Squashfs filesystem, little endian, version 4.0, compression:lzma, size: 3264162 bytes, 1866 inodes, blocksize: 65536 bytes, created: Tue Apr 3 04:12:22 2012
熵分析(-E, --entropy
)
对输入文件执行熵分析,打印原始熵数据并生成熵图。
熵分析可以与–signature,– raw或–opcodes结合使用,以便更好地理解目标文件。
用于识别签名扫描可能遗漏的有趣数据部分:1
2
3
4
5
6
7 binwalk -E firmware.bin
DECIMAL HEXADECIMAL ENTROPY
--------------------------------------------------------------------------------
0 0x0 Rising entropy edge (0.983751)
1155072 0x11A000 Falling entropy edge (0.000000)
1181696 0x120800 Rising entropy edge (0.990546)
3780608 0x39B000 Falling entropy edge (0.000000)
与–verbose选项结合使用时,将打印为每个数据块计算的原始熵:1
2
3
4
5
6
7
8
9
10
11
12
13
14 binwalk -E --verbose firmware.bin
DECIMAL HEX ENTROPY ANALYSIS
--------------------------------------------------------------------------------
0 0x0 0.964914
1024 0x400 0.978591
2048 0x800 0.973048
3072 0xC00 0.976195
4096 0x1000 0.976072
5120 0x1400 0.976734
6144 0x1800 0.976861
7168 0x1C00 0.972385
8192 0x2000 0.972518
...
注意: 如果是使用python API
调用熵分析,需要禁用图形(–nplot)以防止脚本过早退出。
保存熵图为PNG文件并不显示(-J,--save
)
1 | binwalk --save -E firmware.bin |
搜索字符串(-R, --raw=<string>
)
搜索字符串包括转义的八进制和/或十六进制值。
需要搜索自定义的原始字节序列时,可以使用此选项:1
2
3
4
5 binwalk -R "\x00\x01\x02\x03\x04" firmware.bin
DECIMAL HEX DESCRIPTION
-------------------------------------------------------------------------------------------------------------------
377654 0x5C336 Raw string signature
搜索各种CPU架构常见的可执行操作码(-A, --opcodes
)
binwalk
可以在指定文件中搜索各种CPU架构常见的可执行操作码。注: 某些操作码签名很短,因此容易产生误报结果。
当需要在文件中找到可执行代码时,如果需要确定可执行文件的体系结构时,可以使用此选项:1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19 binwalk -A firmware.bin
DECIMAL HEX DESCRIPTION
-------------------------------------------------------------------------------------------------------------------
268 0x10C MIPS instructions, function prologue
412 0x19C MIPS instructions, function prologue
636 0x27C MIPS instructions, function prologue
812 0x32C MIPS instructions, function epilogue
920 0x398 MIPS instructions, function epilogue
948 0x3B4 MIPS instructions, function prologue
1056 0x420 MIPS instructions, function epilogue
1080 0x438 MIPS instructions, function prologue
1356 0x54C MIPS instructions, function epilogue
1392 0x570 MIPS instructions, function prologue
1836 0x72C MIPS instructions, function epilogue
2012 0x7DC MIPS instructions, function prologue
2260 0x8D4 MIPS instructions, function epilogue
2512 0x9D0 MIPS instructions, function prologue
2552 0x9F8 MIPS instructions, function epilogue
搜索签名的自定义魔术签名文件(-m, --magic=<file>
)
加载备用魔术签名文件而不是默认文件。1
2
3
4
5
6
7 binwalk -m ./foobar.mgc firmware.bin
DECIMAL HEX DESCRIPTION
-------------------------------------------------------------------------------------------------------------------
268 0x10C Foobar
412 0x19C Foobar
636 0x27C Foobar
禁用“智能”签名匹配(-b, --dumb
)
智能签名匹配可能导致错过其他有效签名时(例如,通过jump-to-offset关键字),可以使用:1
$ binwalk -b firmware.bin
显示所有包括误标记为无效结果(-I, --invalid
)
binwalk将有效结果误标记为无效结果,并产生大量垃圾输出,可以使用:1
binwalk -I firmware.bin
签名排除过滤器(-x, --exclude=<filter>
)
不过滤被过滤器匹配的签名,过滤器是小写的正则表达式; 可以指定多个过滤器。第一行与指定过滤器匹配的魔术签名根本不会被加载; 因此,使用此过滤器可以帮助减少签名扫描时间。用于排除不需要或不感兴趣的结果:1
binwalk -x 'mach-o' -x '^hp' firmware.bin # exclude HP calculator and OSX mach-o signatures
签名过滤器(-y, --include=<filter>
)
过滤被过滤器匹配的签名,过滤器是小写的正则表达式; 可以指定多个过滤器。只会加载第一行与指定过滤器匹配的魔术签名; 因此,使用此过滤器可以帮助减少签名扫描时间。仅搜索特定签名或签名类型时很有用:1
binwalk -y 'filesystem' firmware.bin # only search for filesystem signatures
识别反汇编代码的CPU体系结构(-Y, --disasm
)
使用capstone
反汇编程序识别文件中包含的可执行代码的CPU体系结构。
使用此扫描指定--verbose
将另外打印反汇编的指令。
通常比--opcodes
执行的简单签名分析更健壮,但支持更少的体系结构:1
2
3
4
5 binwalk --disasm firmware.bin
DECIMAL HEXADECIMAL DESCRIPTION
--------------------------------------------------------------------------------
428 0x1AC MIPS executable code, 32/64-bit, little endian, at least 750 valid instructions
设置反汇编结果的最小连续指令数(-T, --minsn
)
将–disasm结果的最小连续指令数设置为有效。默认值为500条指令:1
2
3
4
5 binwalk --minsn=1200 -Y firmware.bin
DECIMAL HEXADECIMAL DESCRIPTION
--------------------------------------------------------------------------------
428 0x1AC MIPS executable code, 32/64-bit, little endian, at least 1250 valid instructions
反汇编结果连续执行(-k, --continue
)
指示 - disasm不会停在第一个结果:1
2
3
4
5
6
7 binwalk --continue -Y firmware.bin
DECIMAL HEXADECIMAL DESCRIPTION
--------------------------------------------------------------------------------
428 0x1AC MIPS executable code, 32/64-bit, little endian, at least 1250 valid instructions
1048576 0x100000 MIPS executable code, 32/64-bit, little endian, at least 1250 valid instructions
...
忽略–entropy生成的熵图中的图例(-Q, --nngend
)
1 | binwalk --entropy -Q firmware.bin |
禁止对图形熵地块–entropy扫描(-N, --nplot
)
1 | binwalk --entropy -N firmware.bin |
设置上升沿熵触发电平(-H, --high=<float>
)
仅在与–entropy一起使用时有效。指定的值应介于0和1之间:1
binwalk --entropy -H .9 firmware.bin
设置下降沿熵触发电平(-L, --low=<float>
)
仅在与–entropy一起使用时有效。指定的值应介于0和1之间:1
binwalk --entropy -L .3 firmware.bin
十六进制字节彩色输出(-W, --hexdump
)
绿色 - 所有文件中的这些字节都相同
红色 - 这些字节在所有文件中都不同
蓝色 - 这些字节在某些文件中只有不同
可以任意数量的任意文件; 其他有用的选项是–block, - offset, - length和–terse:1
binwalk -W --block = 8 --length = 64 firmware1.bin firmware2.bin firmware3.bin
注意: 如果您需要页面输出安装most实用程序,因为它更好地支持彩色输出的分页。
仅在–hexdump期间显示包含绿色
字节的行:1
binwalk -W --green firmware1.bin firmware2.bin firmware3.bin
仅在–hexdump期间显示包含红色
字节的行:1
binwalk -W --red firmware1.bin firmware2.bin firmware3.bin
仅在–hexdump期间显示包含蓝色
字节的行:1
binwalk -W --blue firmware1.bin firmware2.bin firmware3.bin
提取签名扫描期间识别的文件(-D, --dd=<type[:ext[:cmd]]>
)
提取 - 签名扫描期间识别的文件。可以指定多个–dd选项。
type是签名描述中包含的小写字符串(支持正则表达式)
ext是保存数据磁盘时使用的文件扩展名(默认为none)
cmd是在将数据保存到磁盘后执行的可选命令
默认情况下,文件名是找到签名的十六进制偏移量,除非在签名本身中指定了备用文件名。
以下示例演示如何使用–dd选项指定提取规则,该选项将提取包含文件扩展名为“zip”的字符串“zip archive”的任何签名,然后执行“unzip”命令。此外,PNG图像按原样提取,带有’png’文件扩展名。
请注意使用’%e’占位符。执行unzip命令时,此占位符将替换为解压缩文件的相对路径:1
binwalk -D 'zip archive:zip:unzip %e' -D 'png image:png' firmware.bin
签名扫描期间递归扫描提取的文件(-M, --matryoshka
)
只有有效使用时–extract或–dd。1
binwalk -e -M firmware.bin
设置提取数据的输出目录(-C, --directory=<str>
)
默认值:当前工作目录
仅适用与使用时–extract或–dd选项:1
binwalk -e --directory = / tmp firmware.bin
限制–matryoshka递归深度(-d, --depth=<int>
)
限制–matryoshka递归深度。默认情况下,深度设置为8。
仅在与–matryoshka选项一起使用时才适用:1
binwalk -Me -d 5 firmware.bin
限制从目标文件中分割出的数据大小(-j, --size=<int>
)
默认情况下,没有大小限制。
只有有效使用时–extract或–dd。
请注意,此选项不限制外部提取实用程序提取/解压缩的数据大小。
从具有有限磁盘空间的大型文件中雕刻或提取数据时非常有用:1
binwalk -e --size=0x100000 firmware.bin
清除无法处理的零文件和文件(-r, --rm
)
只有有效使用时–extract或–dd。
用于清除在提取期间从目标文件复制的误报文件:1
binwalk -e -r firmware.bin
刻录数据但不自动提取/解压缩该数据(-z, --carve
)
只有有效使用时–extract或–dd。1
binwalk -e --carve firmware.bin
暴力识别原始deflate压缩数据流(-X, --deflate
)
用于从具有损坏/修改/缺少标头的文件中恢复数据。可以与–lzma结合使用。
此扫描可能很慢,因此使用–offset和/或–length限制扫描区域非常有用:1
binwalk --deflate -o 0x100 -l 10000 firmware.bin
暴力识别原始LZMA压缩数据流(-Z, --lzma
)
用于从具有损坏/修改/缺少标头的文件中恢复数据。可以与–deflate结合使用。
由于LZMA压缩选项的数量不同,此扫描可能非常慢,因此使用–offset和/或–length限制扫描区域非常有用:1
binwalk --lzma -o 0x100 -l 10000 firmware.bin
常见压缩选项搜索压缩流(-P, --partial
)
可以显着提高–lzma扫描的速度:1
binwalk --partial -Z -o 0x100 -l 10000 firmware.bin
在扫描到第一个结果停止(-S, --stop
)
与–lzma和/或–deflate选项一起使用时,这将在显示第一个结果后停止扫描:1
binwalk --stop -Z firmware.bin
设置目标文件中要分析的字节数(-l, --length=<int>
)
1 | binwalk --length=0x100 firmware.bin |
设置起始偏移量(-o, --offset=<int>
)
设置开始分析目标文件的起始偏移量。还可以指定负偏移(距文件结束的距离):1
binwalk --offset=0x100 firmware.bin
设置所有打印偏移的基址(-O, --base=<int>
)
此值将添加到所有打印结果的原始文件偏移量中:1
binwalk --base=0x80001000 firmware.bin
设置分析期间使用的块大小(-K, --block=<int>
)
设置分析期间使用的块大小(以字节为单位)。
与 - 熵一起使用时,这决定了在熵分析期间分析的每个块的大小。
与–hexdump一起使用时,它设置十六进制输出中每行显示的字节数。1
binwalk --diff -K 8 firmware1.bin firmware2.bin
扫描之前反转n个字节(-g, --swap=<int>
)
1 | binwalk --swap=2 firmware.bin |
扫描结果记录到指定的文件(-f, --log=<file>
)
除非指定了–csv,否则保存到日志文件的数据将与终端中显示的数据相同。
即使指定了–quiet,数据也将保存到日志文件中:1
binwalk --log=binwalk.log firmware.bin
日志数据以CSV格式保存(-c, --csv
)
如果与–cast或–hexdump一起使用,则忽略此选项。
仅在与–log选项结合使用时才有效:1
binwalk --log=binwalk.log --csv firmware.bin
格式输出适应终端窗口宽度(-t, --term
)
使输出更具可读性:1
2
3
4
5
6
7
8
9
10
11
12 binwalk --term firmware.bin
DECIMAL HEX DESCRIPTION
-------------------------------------------------------------------------------------------------------
0 0x0 DLOB firmware header, boot partition: "dev=/dev/mtdblock/2"
112 0x70 LZMA compressed data, properties: 0x5D, dictionary size: 33554432
bytes, uncompressed size: 3805904 bytes
1310832 0x140070 PackImg section delimiter tag, little endian size: 15741184 bytes; big
endian size: 3272704 bytes
1310864 0x140090 Squashfs filesystem, little endian, version 4.0, compression:lzma,
size: 3268870 bytes, 1860 inodes, blocksize: 65536 bytes, created:
Mon Apr 22 04:56:42 2013
禁用输出到stdout(-q, --quiet
)
与–log或verbose扫描一起使用时最方便,例如–entropy:1
binwalk --quiet -f binwalk.log firmware.bin
启用详细输出,包括目标文件MD5和扫描时间戳(-v, --verbose
)
如果指定了两次,如果还指定了–extract,则将显示外部提取实用程序的输出:1
2
3
4
5
6
7
8
9
10
11
12
13 binwalk --verbose firmware.bin
Scan Time: 2013-11-10 21:04:04
Signatures: 265
Target File: firmware.bin
MD5 Checksum: 6b91cdff1b4f0134b24b7041e079dd3e
DECIMAL HEX DESCRIPTION
-------------------------------------------------------------------------------------------------------------------
0 0x0 DLOB firmware header, boot partition: "dev=/dev/mtdblock/2"
112 0x70 LZMA compressed data, properties: 0x5D, dictionary size: 33554432 bytes, uncompressed size: 3805904 bytes
1310832 0x140070 PackImg section delimiter tag, little endian size: 15741184 bytes; big endian size: 3272704 bytes
1310864 0x140090 Squashfs filesystem, little endian, version 4.0, compression:lzma, size: 3268870 bytes, 1860 inodes, blocksize: 65536 bytes, created: Mon Apr 22 04:56:42 2013
扫描名称与给定正则表达式字符串匹配的文件(-a, --finclude=<str>
)
当与组合–matryoshka和–extract1
binwalk -M -e --finclude='\.bin$' firmware.bin
不要扫描名称与给定正则表达式字符串匹配的文件(-p, --fexclude=<str>
)
当与组合–matryoshka和–extract1
binwalk -M -e --fexclude='\.pdf$' firmware_archive.zip
指定的端口号上启用状态服务器(-s, --status=<int>
)
状态服务器仅侦听localhost并打印出与当前扫描状态相关的人类可读ASCII数据。您可以使用telnet,netcat等连接到它。1
binwalk --status=8080 firmware_archive.zip
总结
binwalk还有很多功能,比如python API,和IDA配合使用,以及实际应用会遇到很多小技巧,能大大提高取证,逆向固件和CTF misc的效率。当然也存在特别多的问题,也欢迎童鞋们去使用解决这些问题提交issue
。
首发于安恒网络空间安全讲武堂公众号请大家多多关注!