自动提取文件系统---binwalk(一)
Binwalk是路由器固件分析的必备工具,该工具最大的优点就是可以自动完成指定文件的扫描,智能发掘潜藏在文件中所有可疑的文件类型及文件系统。
1、Binwalk和libmagic
Binwalk的扫描实现方法,就是把重复而复杂的手工分析方法通过程序实现。但是Binwalk并不是简单地使用file命令识别文件类型,原因在于file命令占用了太多的磁盘来读写I/O,效率太低,而且file命令识别文件类型是从文件的第一个字节开始,且只能把磁盘上的一个文件识别成一种文件格式,所以会占用很多磁盘空间来保存文件,此外,使用file命令,就需要逐字节把路由器文件分割成多个文件,文件的I/O也必然会极大影响扫描效率。
libmagic动态库为文件扫描提供了更好的解决方案。识别libmagic库函数,可以直接扫描文件的内存镜像,从而提高扫描效率。libmagic库识别文件系统和文件类型依然依赖magic签名文件。
在binwalk中,主要使用来自libmagic库的4个函数,分别为magic_open、magic_close、magic_buffer、magic_load。
- magic_t magic_open(int flags); -----> 创建并返回一个magic_cookie指针。
- void magic_close(magic_t cookie); -----> 关闭magic签名数据库并释放所有使用过的资源。
- const char *magic_buffer(magic_t cookie, const void *buffer, size_t len); -------> 读取buffer中指定长度的数据并与magic签名数据库进行对比,返回对比结果描述。
- int magic_load(magic_t cookie, const char *filename); ---------> 从filename指定文件加载magic签名数据库,binwalk把多个magic签名文件组合到一个临时文件中用于加载。
binwalk是使用python编写的,它通过python调用libmagic库中的导出函数并使用面向对象的方式进行封装,封装文件在binwalk/src/binwalk/core/magic.py中。Magic类包含两个成员函数:
- Magic.buffer(data)函数,读取内存缓冲区数据,判断是否符合某一文件类型。
- Magic.close()函数:关闭magic签名数据库,释放所有使用的资源。
2、Binwalk的提取与分析
2.1、固件扫描
命令:binwalk firmware.bin -----> 通过扫描能够智能地发现目标文件中包含的所有可识别的文件类型。
2.2、提取文件
命令:binwalk -e firmware.bin ------> 选项“-e"和“--extract"用于按照定义的配置文件中的提取方法从固件中提取探测到的文件系统。
命令:binwalk -Me firmware.bin -----> 选项“-M"和“--matryoshka"用于根据magic签名扫描结果进行递归提取,仅对"-e"和“--dd"选项有效。
命令:binwalk -Me -d 5 firmware.bin ----> 选项“-d"和“--depth=<int>"用于限制递归提取深度,默认深度为8,仅当“-M"选项存在时有效。
2.3、显示完整的扫描结果
命令:binwalk -I firmware.bin ------> 选项"-I"和“--invalid"用于显示扫描的所有结果(即使是扫描过程中被定义为“invalid“的项)。
当我们认为binwalk错把有效的文件当成无效文件时,可以通过该选项来检查。
2.4、指令系统分析
选项“A"和“--opcodes"用于扫描指定文件中通用CPU架构的可执行代码。
由于某些操作码签名比较短,所以比较容易造成误判。如果我们需要确定一个可执行文件的CPU架构,可以使用该命令。
命令:命令:binwalk -A 70|more
使用Binwalk扫描从firmware.bin中提取的文件的文件“70”中的可执行代码,在该文件中可以发现CPU的架构(大端或者小端也会给出)。
自动提取文件系统---binwalk(一)的更多相关文章
- OWASP固件安全性测试指南
OWASP固件安全性测试指南 固件安全评估,英文名称 firmware security testing methodology 简称 FSTM.该指导方法主要是为了安全研究人员.软件开发人员.顾问. ...
- iot漏洞入门
路由器漏洞入门 下载项目https://github.com/praetorian-inc/DVRF 安装quem sudo apt install qemu-user-static 安装gdb-mu ...
- binwalk在Windows10和kali_Linux下的安装及使用教程
(一)binwalk简介 binwalk 是用于搜索给定二进制镜像文件以获取嵌入的文件和代码的工具. 具体来说,binwalk是一个固件的分析工具,旨在协助研究人员对固件非分析,提取及逆向工程 ...
- 隐写术工具之binwalk
0x00Binwalk介绍 Binwalk是用于搜索给定二进制镜像文件以获取嵌入的文件和代码的工具. 具体来说,它被设计用于识别嵌入固件镜像内的文件和代码. Binwalk使用libmagic库,因此 ...
- Binwalk:后门(固件)分析利器
http://blog.csdn.net/testing_is_believing/article/details/14091179 Binwalk介绍 Binwalk是一个固件的分析工具,旨在协助研 ...
- ctf-工具-binwalk
binwalk在玩杂项时是个不可缺的工具.1.最简单的,在玩隐写时,首先可以用它来找到其中的字符串例如:在铁人三项,东北赛区个人赛中,有一道题它直接给了一个文件,没有后缀,不知道是什么文件先binwa ...
- 路由器逆向分析------binwalk工具的详细使用说明
本文博客地址:http://blog.csdn.net/qq1084283172/article/details/66971242 一.binwalk工具的基本用法介绍 1.获取帮助信息 $ binw ...
- 路由器逆向分析------binwalk工具的安装
本文博客链接:http://blog.csdn.net/qq1084283172/article/details/65441110 一.binwalk工具运行支持的平台 binwalk工具安装支持的平 ...
- .NET Core的文件系统[5]:扩展文件系统构建一个简易版“云盘”
FileProvider构建了一个抽象文件系统,作为它的两个具体实现,PhysicalFileProvider和EmbeddedFileProvider则分别为我们构建了一个物理文件系统和程序集内嵌文 ...
随机推荐
- php开发APP接口(总结一)
一.什么是app接口:服务端与客户端的数据交互. 大部分APP接口是通过http协议通信的. http通信的三要素: URL: 通信的地址 Method:通信的方式(get | post | pu ...
- pandas绘图
#encoding:utf8 import pandas as pd import numpy as np import matplotlib.pyplot as plt df = pd.DataFr ...
- 关于python requests 包跑ssl的设置 和 charles相关抓包的问题
由于在测试服务器上测试东西都是https,然后最近又在和大神一起开发openapi,api写好当然是要测试的 python上测试接口最好用的莫过于requests模块了.但是 我还从来没有用reque ...
- Mysql索引结构及常见索引的区别
一.Mysql索引主要有两种结构:B+Tree索引和Hash索引 Hash索引 mysql中,只有Memory(Memory表只存在内存中,断电会消失,适用于临时表)存储引擎显示支持Hash索引,是M ...
- node upgrade bug & node-sass
node upgrade bug & node-sass bug solution rebuild $ npm rebuild node-sass OK
- html5 sessionStorage VS loaclStorage
localStorage:沒有時間限制的存儲,數據一致存在 sessionStorage:針對一個session的存儲,會話頁面關閉后,數據被刪除 以前這些都是通過cookie來完成的,但是cooki ...
- Lodop不要把客户端的打印机共享到服务器上 再在客户端打印
客户端打印需要每个客户端都安装,Lodop插件方式和C-Lodop方式,都是安装一次后,无需再次安装,c-lodop默认也是开机自启动的.集中打印方式,可以打印到某台电脑(作为云主机)上,但是不能打印 ...
- lvs逻辑卷详解
管理磁盘空间对系统管理员来说是一件重要的日常工作.一旦磁盘空间耗尽就需要进行一系列耗时而又复杂的任务,以提升磁盘分区中可用的磁盘空间.它也需要系统离线才能处理.通常这种任务会涉及到安装一个新的硬盘.引 ...
- java BigDecimal加减乘除 与 保留两位小数
BigDecimal bignum1 = new BigDecimal("10"); BigDecimal bignum2 = new BigDecimal("5&quo ...
- 自学Linux Shell11.4-重定向输入输出
点击返回 自学Linux命令行与Shell脚本之路 11.4-重定向输入输出 Linux 命令默认从标准输入设备(stdin)获取输入,将结果输出到标准输出设备(stdout)显示.一般情况下,标准输 ...