侵删

前言

本周一 安恒萌新粉丝群:928102972分享的工具为 binwalkBinwalk是一款快速、易用,用于分析,逆向工程和提取固件映像的工具。简单易用,完全自动化脚本,并通过自定义签名,提取规则和插件模块,还重要一点的是可以轻松地扩展。 在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.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选项提取它在固件映像中找到的任何文件。

$ binwalk -e firmware.bin

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

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

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

$ 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.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)

$ binwalk --save -E firmware.bin

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

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

$ binwalk -R "\x00\x01\x02\x03\x04" firmware.bin

DECIMAL       HEX         DESCRIPTION
-------------------------------------------------------------------------------------------------------------------
377654        0x5C336     Raw string signature

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

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

$ 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>)

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

$ binwalk -m ./foobar.mgc firmware.bin

DECIMAL         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.bin

DECIMAL       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.bin

DECIMAL       HEXADECIMAL     DESCRIPTION
--------------------------------------------------------------------------------
428           0x1AC           MIPS executable code, 32/64-bit, little endian, at least 1250 valid instructions

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

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

$ 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)

$ 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.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:

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

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

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

$ 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和–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

本文分享自微信公众号 - 安恒网络空间安全讲武堂(cyberslab),作者:安恒大学

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐