前言
本周一安恒萌新粉丝群: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 | sudo su //如果不是root账号建议先获取root权限,防止出现权限不足的问题 |
如果执行命令的中途出现了无法获得锁 /var/lib/dpkg/lock - open (11: 资源暂时不可用) ubuntu 安装vim 及遇到的错误处理
,执行下面命令:
1 | sudo rm /var/cache/apt/archives/lock //如果是root账号可以去掉sudo |
binwalk
还需要安装一些依赖项,具体的大家可以去Wilk
上查看,如果是Debian / Ubuntu
源代码里已经给了一键自动安装依赖项的脚本,运行命令:
1 | sudo ./deps.sh //切换到binwalk目录下 |
卸载:
1 | python setup.py idauninstall --idadir = / home / user / ida |
参数介绍使用
显示binwalk帮助输出(`-h, –help)
1 | binwalk --help |
扫描固件
binwalk
的主要功能 - 也是迄今为止最受欢迎的功能。Binwalk
可以扫描许多不同嵌入式文件类型和文件系统的固件映像,只需给它一个要扫描的文件列表:
1 | binwalk firmware.bin |
文件提取(-e,--extract
)
这个功能也是一个常用的功能,在CTF中很多文件分解的misc题
都可以使用binwalk
提高效率相对于使用winhex
这类工具。
可以使用-e
选项提取它在固件映像中找到的任何文件。
1 | $ binwalk -e firmware.bin |
签名分析(-B,--signature
)
对目标文件执行签名分析,如果未指定其他分析选项,则这是默认值。
如果希望将签名分析与其他分析器(例如 - 熵)结合使用,请使用此选项:
1 | binwalk --signature firmware.bin |
熵分析(-E, --entropy
)
对输入文件执行熵分析,打印原始熵数据并生成熵图。
熵分析可以与–signature,– raw或–opcodes结合使用,以便更好地理解目标文件。
用于识别签名扫描可能遗漏的有趣数据部分:
1 | binwalk -E firmware.bin |
与–verbose选项结合使用时,将打印为每个数据块计算的原始熵:
1 | binwalk -E --verbose firmware.bin |
注意: 如果是使用python API
调用熵分析,需要禁用图形(–nplot)以防止脚本过早退出。
保存熵图为PNG文件并不显示(-J,--save
)
1 | binwalk --save -E firmware.bin |
搜索字符串(-R, --raw=<string>
)
搜索字符串包括转义的八进制和/或十六进制值。
需要搜索自定义的原始字节序列时,可以使用此选项:
1 | binwalk -R "\x00\x01\x02\x03\x04" firmware.bin |
搜索各种CPU架构常见的可执行操作码(-A, --opcodes
)
binwalk
可以在指定文件中搜索各种CPU架构常见的可执行操作码。注: 某些操作码签名很短,因此容易产生误报结果。
当需要在文件中找到可执行代码时,如果需要确定可执行文件的体系结构时,可以使用此选项:
1 | binwalk -A firmware.bin |
搜索签名的自定义魔术签名文件(-m, --magic=<file>
)
加载备用魔术签名文件而不是默认文件。
1 | binwalk -m ./foobar.mgc firmware.bin |
禁用“智能”签名匹配(-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 | binwalk --disasm firmware.bin |
设置反汇编结果的最小连续指令数(-T, --minsn
)
将–disasm结果的最小连续指令数设置为有效。默认值为500条指令:
1 | binwalk --minsn=1200 -Y firmware.bin |
反汇编结果连续执行(-k, --continue
)
指示 - disasm不会停在第一个结果:
1 | binwalk --continue -Y firmware.bin |
忽略–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 | binwalk --term firmware.bin |
禁用输出到stdout(-q, --quiet
)
与–log或verbose扫描一起使用时最方便,例如–entropy:
1 | binwalk --quiet -f binwalk.log firmware.bin |
启用详细输出,包括目标文件MD5和扫描时间戳(-v, --verbose
)
如果指定了两次,如果还指定了–extract,则将显示外部提取实用程序的输出:
1 | binwalk --verbose firmware.bin |
扫描名称与给定正则表达式字符串匹配的文件(-a, --finclude=<str>
)
当与组合–matryoshka和–extract
1 | binwalk -M -e --finclude='\.bin$' firmware.bin |
不要扫描名称与给定正则表达式字符串匹配的文件(-p, --fexclude=<str>
)
当与组合–matryoshka和–extract
1 | 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
。
首发于安恒网络空间安全讲武堂公众号请大家多多关注!