前言

本周一安恒萌新粉丝群:928102972分享的工具为binwalk
Binwalk是一款快速、易用,用于分析,逆向工程和提取固件映像的工具。简单易用,完全自动化脚本,并通过自定义签名,提取规则和插件模块,还重要一点的是可以轻松地扩展。
在CTF的MISC类题型和IOT安全的固件解包分析中广泛应用,可以大大提高效率。该工具对linux支持较好,对于windows功能支持较差,有条件的童鞋可以在linux上使用练习该神器。

BinWalk安装部署

binwalkgithub项目:https://github.com/ReFirmLabs/binwalk
binwalk的wiki:https://github.com/devttys0/binwalk/wiki
binwalk是一款python编写的工具,目前python2.xpython3.x都较好的支持,不过在Python3.x中运行速度更快。在kali里面已经预装了,在其他发行版linux中安装也很简单,不过在windows上会稍微繁琐一些。
windows下的安装和使用方法可以参考pcat大表哥的方法https://www.cnblogs.com/pcat/p/5256288.html。
wiki上对于安装使用已经说的非常详细了。建议英文好的童鞋可以直接看官方的资料。网上资料也很多,这里就简单的翻译总结一下。
这里使用kali linux演示(基于Debian的linux发行版开发的一个渗透数字取证的系统)
注意: 如果原来系统已经安装了旧版binwalk,这里建议先卸载再安装新版本,以防止出现不兼容和API冲突等问题。

$ 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 及遇到的错误处理,执行下面命令:

sudo rm /var/cache/apt/archives/lock //如果是root账号可以去掉sudo
sudo rm /var/lib/dpkg/lock

binwalk还需要安装一些依赖项,具体的大家可以去Wilk上查看,如果是Debian / Ubuntu源代码里已经给了一键自动安装依赖项的脚本,运行命令:

$ sudo ./deps.sh //切换到binwalk目录下

安装IDA插件

binwalk还可以安装binwalk IDA插件,这个功能对于做固件逆向的功能是非常方便的。安装:

$ python setup.py idainstall --idadir = / home / user / ida

卸载:

$ python setup.py idauninstall --idadir = / home / user / ida

参数介绍使用

显示binwalk帮助输出(`-h, --help)

$ binwalk --help

扫描固件

binwalk的主要功能 - 也是迄今为止最受欢迎的功能。
Binwalk可以扫描许多不同嵌入式文件类型和文件系统的固件映像,只需给它一个要扫描的文件列表:

$ binwalk firmware.binDECIMAL    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选项提取它在固件映像中找到的任何文件。

$ binwalk -e firmware.bin

签名分析(-B,--signature)

对目标文件执行签名分析,如果未指定其他分析选项,则这是默认值。
如果希望将签名分析与其他分析器(例如 - 熵)结合使用,请使用此选项:

$ binwalk --signature firmware.binDECIMAL    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结合使用,以便更好地理解目标文件。
用于识别签名扫描可能遗漏的有趣数据部分:

$ 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选项结合使用时,将打印为每个数据块计算的原始熵:

$ binwalk -E --verbose firmware.binDECIMAL         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)

$ binwalk --save -E firmware.bin

搜索字符串(-R, --raw=<string>)

搜索字符串包括转义的八进制和/或十六进制值。
需要搜索自定义的原始字节序列时,可以使用此选项:

$ binwalk -R "\x00\x01\x02\x03\x04" firmware.binDECIMAL    HEX         DESCRIPTION
-------------------------------------------------------------------------------------------------------------------
377654      0x5C336     Raw string signature

搜索各种CPU架构常见的可执行操作码(-A, --opcodes)

binwalk可以在指定文件中搜索各种CPU架构常见的可执行操作码。注: 某些操作码签名很短,因此容易产生误报结果。
当需要在文件中找到可执行代码时,如果需要确定可执行文件的体系结构时,可以使用此选项:

$ binwalk -A firmware.binDECIMAL         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>)

加载备用魔术签名文件而不是默认文件。

$ binwalk -m ./foobar.mgc firmware.binDECIMAL         HEX             DESCRIPTION
-------------------------------------------------------------------------------------------------------------------
268             0x10C           Foobar
412             0x19C           Foobar
636             0x27C           Foobar

禁用“智能”签名匹配(-b, --dumb)

智能签名匹配可能导致错过其他有效签名时(例如,通过jump-to-offset关键字),可以使用:

$ binwalk -b firmware.bin

显示所有包括误标记为无效结果(-I, --invalid)

binwalk将有效结果误标记为无效结果,并产生大量垃圾输出,可以使用:

$ binwalk -I firmware.bin

签名排除过滤器(-x, --exclude=<filter>)

不过滤被过滤器匹配的签名,过滤器是小写的正则表达式; 可以指定多个过滤器。第一行与指定过滤器匹配的魔术签名根本不会被加载; 因此,使用此过滤器可以帮助减少签名扫描时间。用于排除不需要或不感兴趣的结果:

$ binwalk -x 'mach-o' -x '^hp' firmware.bin # exclude HP calculator and OSX mach-o signatures

签名过滤器(-y, --include=<filter>)

过滤被过滤器匹配的签名,过滤器是小写的正则表达式; 可以指定多个过滤器。只会加载第一行与指定过滤器匹配的魔术签名; 因此,使用此过滤器可以帮助减少签名扫描时间。仅搜索特定签名或签名类型时很有用:

$ binwalk -y 'filesystem' firmware.bin # only search for filesystem signatures

识别反汇编代码的CPU体系结构(-Y, --disasm)

使用capstone反汇编程序识别文件中包含的可执行代码的CPU体系结构。
使用此扫描指定--verbose将另外打印反汇编的指令。
通常比--opcodes执行的简单签名分析更健壮,但支持更少的体系结构:

$ binwalk --disasm firmware.binDECIMAL       HEXADECIMAL     DESCRIPTION
--------------------------------------------------------------------------------
428           0x1AC           MIPS executable code, 32/64-bit, little endian, at least 750 valid instructions

设置反汇编结果的最小连续指令数(-T, --minsn)

将–disasm结果的最小连续指令数设置为有效。默认值为500条指令:

$ binwalk --minsn=1200 -Y firmware.binDECIMAL       HEXADECIMAL     DESCRIPTION
--------------------------------------------------------------------------------
428           0x1AC           MIPS executable code, 32/64-bit, little endian, at least 1250 valid instructions

反汇编结果连续执行(-k, --continue)

指示 - disasm不会停在第一个结果:

$ binwalk --continue -Y firmware.binDECIMAL       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)

$ binwalk --entropy -Q firmware.bin

禁止对图形熵地块–entropy扫描(-N, --nplot)

$ binwalk --entropy -N firmware.bin

设置上升沿熵触发电平(-H, --high=<float>)

仅在与–entropy一起使用时有效。指定的值应介于0和1之间:

$ binwalk --entropy -H .9 firmware.bin

设置下降沿熵触发电平(-L, --low=<float>)

仅在与–entropy一起使用时有效。指定的值应介于0和1之间:

$ binwalk --entropy -L .3 firmware.bin

十六进制字节彩色输出(-W, --hexdump)

绿色 - 所有文件中的这些字节都相同
红色 - 这些字节在所有文件中都不同
蓝色 - 这些字节在某些文件中只有不同
可以任意数量的任意文件; 其他有用的选项是–block, - offset, - length和–terse:

$ binwalk -W --block = 8 --length = 64 firmware1.bin firmware2.bin firmware3.bin

注意: 如果您需要页面输出安装most实用程序,因为它更好地支持彩色输出的分页。
仅在–hexdump期间显示包含绿色字节的行:

$ binwalk -W --green firmware1.bin firmware2.bin firmware3.bin

仅在–hexdump期间显示包含红色字节的行:

$ binwalk -W --red firmware1.bin firmware2.bin firmware3.bin

仅在–hexdump期间显示包含蓝色字节的行:

$ 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命令时,此占位符将替换为解压缩文件的相对路径:

$ binwalk -D 'zip archive:zip:unzip %e' -D 'png image:png' firmware.bin

签名扫描期间递归扫描提取的文件(-M, --matryoshka)

只有有效使用时–extract或–dd。

$ binwalk -e -M firmware.bin

设置提取数据的输出目录(-C, --directory=<str>)

默认值:当前工作目录
仅适用与使用时–extract或–dd选项:

$ binwalk -e --directory = / tmp firmware.bin

限制–matryoshka递归深度(-d, --depth=<int>)

限制–matryoshka递归深度。默认情况下,深度设置为8。
仅在与–matryoshka选项一起使用时才适用:

$ binwalk -Me -d 5 firmware.bin

限制从目标文件中分割出的数据大小(-j, --size=<int>)

默认情况下,没有大小限制。
只有有效使用时–extract或–dd。
请注意,此选项不限制外部提取实用程序提取/解压缩的数据大小。
从具有有限磁盘空间的大型文件中雕刻或提取数据时非常有用:

$ binwalk -e --size=0x100000 firmware.bin

清除无法处理的零文件和文件(-r, --rm)

只有有效使用时–extract或–dd。
用于清除在提取期间从目标文件复制的误报文件:

$ binwalk -e -r firmware.bin

刻录数据但不自动提取/解压缩该数据(-z, --carve)

只有有效使用时–extract或–dd。

$ binwalk -e --carve firmware.bin

暴力识别原始deflate压缩数据流(-X, --deflate)

用于从具有损坏/修改/缺少标头的文件中恢复数据。可以与–lzma结合使用。
此扫描可能很慢,因此使用–offset和/或–length限制扫描区域非常有用:

$ binwalk --deflate -o 0x100 -l 10000 firmware.bin

暴力识别原始LZMA压缩数据流(-Z, --lzma)

用于从具有损坏/修改/缺少标头的文件中恢复数据。可以与–deflate结合使用。
由于LZMA压缩选项的数量不同,此扫描可能非常慢,因此使用–offset和/或–length限制扫描区域非常有用:

$ binwalk --lzma -o 0x100 -l 10000 firmware.bin

常见压缩选项搜索压缩流(-P, --partial)

可以显着提高–lzma扫描的速度:

$ binwalk --partial -Z -o 0x100 -l 10000 firmware.bin

在扫描到第一个结果停止(-S, --stop)

与–lzma和/或–deflate选项一起使用时,这将在显示第一个结果后停止扫描:

$ binwalk --stop -Z firmware.bin

设置目标文件中要分析的字节数(-l, --length=<int>)

$ binwalk --length=0x100 firmware.bin

设置起始偏移量(-o, --offset=<int>)

设置开始分析目标文件的起始偏移量。还可以指定负偏移(距文件结束的距离):

$ binwalk --offset=0x100 firmware.bin

设置所有打印偏移的基址(-O, --base=<int>)

此值将添加到所有打印结果的原始文件偏移量中:

$ binwalk --base=0x80001000 firmware.bin

设置分析期间使用的块大小(-K, --block=<int>)

设置分析期间使用的块大小(以字节为单位)。
与 - 熵一起使用时,这决定了在熵分析期间分析的每个块的大小。
与–hexdump一起使用时,它设置十六进制输出中每行显示的字节数。

$ binwalk --diff -K 8 firmware1.bin firmware2.bin

扫描之前反转n个字节(-g, --swap=<int>)

$ binwalk --swap=2 firmware.bin

扫描结果记录到指定的文件(-f, --log=<file>)

除非指定了–csv,否则保存到日志文件的数据将与终端中显示的数据相同。
即使指定了–quiet,数据也将保存到日志文件中:

$ binwalk --log=binwalk.log firmware.bin

日志数据以CSV格式保存(-c, --csv)

如果与–cast或–hexdump一起使用,则忽略此选项。
仅在与–log选项结合使用时才有效:

$ binwalk --log=binwalk.log --csv firmware.bin

格式输出适应终端窗口宽度(-t, --term)

使输出更具可读性:

$ binwalk --term firmware.binDECIMAL     HEX         DESCRIPTION
-------------------------------------------------------------------------------------------------------
0           0x0         DLOB firmware header, boot partition: "dev=/dev/mtdblock/2"
112         0x70        LZMA compressed data, properties: 0x5D, dictionary size: 33554432bytes, uncompressed size: 3805904 bytes
1310832     0x140070    PackImg section delimiter tag, little endian size: 15741184 bytes; bigendian 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:

$ binwalk --quiet -f binwalk.log firmware.bin

启用详细输出,包括目标文件MD5和扫描时间戳(-v, --verbose)

如果指定了两次,如果还指定了–extract,则将显示外部提取实用程序的输出:

$ binwalk --verbose firmware.binScan Time:     2013-11-10 21:04:04
Signatures:    265
Target File:   firmware.bin
MD5 Checksum:  6b91cdff1b4f0134b24b7041e079dd3eDECIMAL      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和–extract

$ binwalk -M -e --finclude='\.bin$' firmware.bin

不要扫描名称与给定正则表达式字符串匹配的文件(-p, --fexclude=<str>)

当与组合–matryoshka和–extract

$ binwalk -M -e --fexclude='\.pdf$' firmware_archive.zip

指定的端口号上启用状态服务器(-s, --status=<int>)

状态服务器仅侦听localhost并打印出与当前扫描状态相关的人类可读ASCII数据。您可以使用telnet,netcat等连接到它。

$ binwalk --status=8080 firmware_archive.zip

总结

binwalk还有很多功能,比如python API,和IDA配合使用,以及实际应用会遇到很多小技巧,能大大提高取证,逆向固件和CTF misc的效率。当然也存在特别多的问题,也欢迎童鞋们去使用解决这些问题提交issue
首发于安恒网络空间安全讲武堂公众号请大家多多关注!

博客原文链接

BinWalk安装和命令参数详解相关推荐

  1. [原创]Saltstack学习笔记:命令参数详解以及配置文件说明

    很久没有更新saltstack的文章了,今天还是来更新一点,又开始对saltstack复习了一下. 前边写了一点<saltstack入门概述(1)>以及<Saltstack如何安装( ...

  2. oracle spool 分隔符_sqlplus--spool命令参数详解

    sqlplus--SPOOL参数详解 Spool是Oracle快速导出数据的工具,是sqlplus的指令,不是sql语法里的东西 一.Spool常用的设置 set arraysize 5000;  / ...

  3. Windows中ipconfig /all命令参数详解

    ipconfig命令参数详解 结果详解 1.主机名:本机PC的hostname,主机名指得是网络上设备的名称,主机名即计算机名,是用来标识计算机在"网上邻居"里是身份的,这样其他用 ...

  4. oracle imp 1403,Oracle中用exp/imp命令参数详解【转】

    Oracle中用exp/imp命令参数详解 [用 exp 数 据 导 出]: 1  将数据库TEST完全导出,用户名system 密码manager 导出到D:daochu.dmp中 expsyste ...

  5. shell编程系列23--shell操作数据库实战之mysql命令参数详解

    shell编程系列23--shell操作数据库实战之mysql命令参数详解mysql命令参数详解-u 用户名-p 用户密码-h 服务器ip地址-D 连接的数据库-N 不输出列信息-B 使用tab键代替 ...

  6. linux :Tar 命令参数详解

    linux Tar 命令参数详解 tar命令 1. 作用 tar命令是Unix/Linux系统中备份文件的可靠方法,几乎可以工作于任何环境中,它的使用权限是所有用户. 2. 格式 tar [主选项+辅 ...

  7. java ext.dirs_关于-Djava.ext.dirs使用及JAVA 命令参数详解System.setProperty

    大家在linux环境下使用命令行执行java程序时,经常要使用到大量外部的jar包或class文件,一般我们有哪些方式可以用呢? -classpath,命令格式:# java -classpath , ...

  8. Windows 运行chkdsk磁盘修复工具命令参数详解

    Windows 运行chkdsk磁盘修复工具命令参数详解 chkdsk是Windows系统自带的磁盘修复工具,通常在电脑非正常关机之后再开机,系统就会自动调用chkdsk工具进行磁盘扫描和修复.同时, ...

  9. Mount 命令参数详解

    Mount 命令参数详解 mount是Linux下的一个命令,它可以将分区挂接到Linux的一个文件夹下,从而将分区和该文件夹关联起来,因此只要访问这个文件夹,就相当于访问该分区了. 目前mount已 ...

最新文章

  1. Nginx源码分析:master/worker工作流程概述
  2. MySQL · 性能优化· CloudDBA SQL优化建议之统计信息获取
  3. JS-WEB-API(存储)
  4. wxWidgets:wxColourPickerEvent类用法
  5. 微信支付商业版 结算周期_了解商业周期
  6. 「理解HTTP」之常见的状态码
  7. 500个爆文标题_美食爆文大放送 | 烹饪技巧从细节着手,夏日消暑美食最为应时...
  8. Spark消费kafka任务卡死:Marking the coordinator xxx:9092 (id: 2147483647 rack: null) dead for group xxx
  9. 移动端中 H5输入框在弹起键盘后被遮挡
  10. linux查找文件夹名称
  11. 医疗服务系统设计说明书
  12. Excel公式中的LookUp三剑客(可以取代Vlookup的神秘公式)
  13. dva开发框架简介和演示
  14. “好家园房产中介网后台管理”python项目
  15. 教你几招HASH表查找的方法
  16. b站黑马Vue2后台管理项目笔记——(1)登录功能
  17. i3-10110U和i5 8250u 哪个好
  18. 西部学刊杂志西部学刊杂志社西部学刊编辑部2022年第14期目录
  19. 1.python网页设计,点击按键显示对话窗口
  20. netstat查看系统TIME_WAIT状态个数

热门文章

  1. 入门必备 Android手机八大实用秘籍
  2. 中文域名都有哪些类型?
  3. 诛仙手游最新服务器,诛仙手游公测服务器征名 服务器名称你做主
  4. 小技巧--Tips--如何显示有纹理代码块背景
  5. 米新江语录整理2020年8月20日-2020年9月10日
  6. junjie -python变量名
  7. Python timedelta
  8. 凡普金科品牌升级一周年 Fintech布局势能显现
  9. win8.1不支持交行满金宝的解决方法
  10. 关于个人所得税计算问题的一些心得