CTF—基于BinWalk实现文件提取
文章目录
- 预备知识
- BinWalk
- AES算法
- AesKeyFind
- PyCrypto库
- Python扩展库安装
- 【PyCrypto】
- 题目描述:
- 考察意图:
- 【磁盘镜像分析】
- 【AES密钥提取以及数据解密】
预备知识
BinWalk
BinWalk是一款固件分析工具,旨在协助研究人员对固件进行分析、提取及逆向工程之用。BinWalk简单易用,支持自动化脚本、自定义签名、提取规则和插件模块。BinWalk的使用方法十分简单,提供待分析的文件路径即可。
【BinWalk】常用于识别任意二进制数据块中所包含的指定类型的文件数据。
AES算法
AES(高级加密标准)是一个对称分组密码算法,旨在取代DES(数据加密标准)成为广泛使用的标准,其加密过程比较复杂,分为字节代替、行移位、列混淆、轮密钥加四个步骤,具体的实现过程大家可以参考《密码编码学与网络安全——原理与实践》(第五版)一书第五章的内容。
AES加密算法明文分组的长度为16字节(即128位),密钥的长度可以是16,24或32字节(即128,192或256位)。
根据密钥的长度,算法相应的最称之为AES-128、AES-192或AES-256。
AesKeyFind
AesKeyFind是一款用于搜寻文件中可能存在的AES key的工具,在Linux下可以通过sudo apt-get install aeskeyfind快速进行安装,Windows版本可以从页面http://jessekornblum.livejournal.com/269749.html下载到。
PyCrypto库
PyCrypto是一个密码学相关的Python扩展库,支持AES、DES、RSA等各种主流加密算法的加解密操作。
Python扩展库安装
在CTF比赛中我们会经常用到BinWalk这款工具,主要用于识别二进制文件中是否包含有额外的文件数据。
在Linux下安装BinWalk十分简单,直接使用sudo apt-get install binwalk即可,而在Windows下安装BinWalk则稍微麻烦一点。
鉴于之前有的同学不知道如何在Windows安装这一款工具,我们在这里进行一个详细的介绍。
【BinWalk】在GitHub上的项目地址
BinWalk下载,我们可以通过git来下载它的源代码,或者点击页面右侧的“Download ZIP”按钮来下载
待程序安装完毕之后,就可以在相关下载目录下看到一个binwalk文件了
现在只需要在命令提示符下执行“python C:\Python27\Scripts(相关目录)\binwalk 文件名”就可以运行BinWalk来分析文件了,如果我们不指定文件名只运行binwalk,那么会打印出相应的帮助信息,如下图所示:
【PyCrypto】
接下来安装我们需要用到的另一个Python扩展库【PyCrypto】。
可以从地址【PyCrypto】下载找到Windows下的扩展包安装程序,只需要下载对应的安装程序后运行即可。
下载完毕后双击exe安装程序,一路单击“下一步”按钮即可完成安装。
安装完毕后可以进行一下验证:
打开CMD命令提示符并执行python,在Python解释器中执行from Crypto.Cipher import AES这一句代码,
如果没有任何提示信息则表明PyCrypto扩展包安装成功
如下图所示:
题目解析
题目描述:
第三届360信息安全大赛比赛原题
一个名为data.7z的文件,请对该文件进行分析,找到 flag{xxx}
考察意图:
考察选手对【磁盘数据恢复与提取】、【AES加密算法】的了解程度。
【磁盘镜像分析】
(1)解压题目提供的data.7z文件得到一个名为data.img的文件,从后缀img来看这可能是一个磁盘镜像文件,
(2)这里我们可以尝试使用BinWalk来对其进行扫描。打开CMD命令提示符,首先切换到相关目录,
(3)随后执行python C:\相关目录)\binwalk data.img -f res.txt命令。因为BinWalk可能产生大量扫描结果,而CMD默认的缓冲区无法保存这么多的输出数据,因此这里使用-f参数将扫描结果输出到res.txt文件中,
如下图所示:
等待扫描完毕之后我们就可以打开res.txt来查看扫描结果了。
通常来说在数据文件中可能会存在Zip文件或者Rar文件,
这里使用Notepad++打开res.txt文件,搜索关键字Zip archive data,一共找到四个搜索结果
如下图所示:
仔细对比可以看出,这四个压缩包中的文件名都是data_encrypted,而且大小都是一样的,
所以这四个文件的数据可能是一样的。
我们定位到第一个Zip文件,从【BinWalk】的扫描结果可以看出数据的起始地址为0xE69AD04,数据的结束地址为0xE69ADD0。
不过这里再次强调一下,Windows下安装的【BinWalk扩展包】对Zip结束位置的扫描结果并不完全准确,Zip末尾22字节的数据会被忽略,
所以这里正确的结束位置应该是 0xE69ADD0 + 22 = 0xE69ADE6,
即Zip文件的数据范围为0xE69AD04 ~ 0xE69ADE6。
现在我们可以编写一个Python脚本来提取这一段数据
Python脚本源代码如下所示:
def extract_file(src, dst, beg, end):# 打开data.img文件f = open(src, "rb")# 移动文件指针到zip起始位置f.seek(beg)# 读取zip文件的数据data = f.read(end - beg)# 关闭文件f.close()# 打开目标文件f = open(dst, "wb")# 写入zip文件的数据f.write(data)# 保存文件f.close()if __name__ == "__main__":extract_file("data.img", "res.zip", 0xE69AD04, 0xE69ADE6)
双击运行便可在当前目录下生成res.zip文件,解压即可提取出data_encrypted文件。
注意我们在py脚本中并没有读取 img 文件的全部数据,而是使用了seek方法来移动文件指针,这样可以加快脚本的处理效率。
seek方法的第一个参数指定要移动的距离,第二个参数指定移动的起点,可以是如下的三个值:
1. os.SEEK_SET,也就是0,表示文件的起始位置;2. os.SEEK_CUR,也就是1,表示当前文件指针所在位置;3. os.SEEK_END,也就是2,表示文件的结束位置;
第二个参数如果没有指定具体的值,那么默认为os.SEEK_SET,也就是0。
【AES密钥提取以及数据解密】
解压提取出来的ZIP文件,使用Notepad++打开之后发现是乱码,那么可以使用十六进制编辑器来看看文件中的数据。
选中data_encrypted文件后单击右键,选择发送到C32Asm,就可以使用C32Asm来打开文件了,
打开后可以看出文件的长度为48字节,但是从文件的内容看不出来是什么加密算法。
考虑到AES加密算法分组的长度为16字节,所以这里可能是AES加密算法(3个分组长度),但是AES加解密是需要KEY的,我们可以使用【AesKeyFind工具】来扫描一下data.img文件。
可以看到扫描出了3个结果,其中前面2个结果是一样的
如下图所示:
现在我们编写一段Python脚本来进行解密
源代码如下所示:
from Crypto.Cipher import AESdef decrypt(filename, keys):# 读取密文数据data = open(filename, "rb").read()# 遍历密钥列表for key in keys:# 去除空格key = "".join(key.split(" "))# 16进制解码key = key.decode("hex")# 打印解密结果print AES.new(key, AES.MODE_ECB).decrypt(data) if __name__ == "__main__":# aeskeyfind扫描到的密钥keys = ["3a e3 83 e2 16 3d d4 42 70 28 4f 15 54 d9 be 8d","cd a2 bd c8 f2 0c 46 db 21 6c 0a 61 6c d1 1e 11"]# AES解密decrypt("data_encrypted", keys)
执行decrypt.py脚本即可看到解密结果,其中第一个解密结果为 flag{245d734b559c6b084b7ecb40596055243e8afdd2},
说明第一个key是正确的密钥
如下图所示:
经过上面的分析,可以知道flag为flag{245d734b559c6b084b7ecb40596055243e8afdd2}。
CTF—基于BinWalk实现文件提取相关推荐
- 深度学习和目标检测系列教程 8-300:目标检测常见的标注工具LabelImg和将xml文件提取图像信息
@Author:Runsen 图像标注主要用于创建数据集进行图片的标注.本篇博客将推荐一款非常实用的图片标注工具LabelImg,重点介绍其安装使用过程.如果想简单点,请直接下载打包版(下载地址见结尾 ...
- Wallpaper Engine pkg壁纸文件提取工具
简介: RePKG-GUI 基于RePKG开发,适用于Wallpaper Engine壁纸的用户,可以帮助用户轻松下载Wallpaper Engine中的壁纸图片,让用户可以获取到自己喜欢的壁纸,软件 ...
- php实现文件管理系统,基于php的文件管理系统程序设计与实现
技术与市场2013年第卷第6期 技术研发 基于php的文件管理系统程序设计与实现 熊燕1,曹晓峰2 (1.达州职业技术学院,四川达州635仪2,达州市人事考试中心,四川达州635仪) 摘要:随着行政管 ...
- 基于网站html文件查找恶意外链
恶意外链|基于网站html文件查找恶意外链 声明:刚入门Python,第一次发文,分享学习,不足之处请大佬点评.本文内容仅供参考,未经允许不得转载. 0x00 前言 恶意外链存在形式多样,并没有一个具 ...
- linux拷贝音频文件,安装 CD 音频文件提取工具 Flacon
Flacon 是一款 Qt 工具,用于从音频 CD 中提取个人曲目,基于在CUE文件中提供的信息提取如 WavPack. APE. FLAC. WAV 或 True Audio. 该应用程序提供了输出 ...
- Wireshark抓取的数据包文件提取
(第一种方法 直接使用wireshark自带的导出) 分离图片文件) wireshark在指定的数据流中提取文件很简单.先选中要提取文件的数据包.wrieshark都会标明文件的类型.所以我们也就能够 ...
- 基于聚类的方法提取关键帧
基于聚类的关键帧提取法 会弹出这几幅关键帧的图像 程序中的基本思路: 1.以第一帧图像的R,G,B直方图为初始质心,获取第一幅图像的R,G,B三幅图像的直方图,为1*256的矩 ...
- 基于php下载文件的详解
基于php下载文件的详解 本篇文章是对php下载文件进行了详细的分析介绍,需要的朋友参考下 php下载文件,比如txt文件. 出现的效果就是,弹出浏览器自带的下载框,出现另存为操作.有时候会出现内存溢 ...
- scp 命令 路径_基于SSH的文件传输:scp命令
日常开发中,经常需要在服务器和本地之间进行文件传输.这里来介绍一种基于SSH的文件传输方法--scp命令 命令格式 scp(secure copy,remote file copy program), ...
最新文章
- 游客功能怎么实现 php,php链式操作的实现方式分析
- 梦有感 2009-10
- C++ string清空并释放内存空间的两种方法(shrink_to_fit()、swap())
- android在屏幕最下方,如何将view固定在屏幕底部?
- AI学习与进阶实践-基于行业价值的AI学习与进阶路径
- iphone已停用解锁大概多少钱_【待办清单工具之三】微软To Do amp; iPhone提醒事项-来自大厂的时间管理系统...
- MySQL 5.6 5.7最优配置文件模板
- C++——构建单链表的方法
- 重装jdk后运行java程序出现Error: could not open `C:\Program Files\Java\jre68\lib\amd64\jvm.cfg'的解决办法
- String类基础的那些事!
- 这九年来都在干嘛-兄弟连IT教育
- 对象转json时,Date类型字段处理。
- 腾讯无线副总李颖:腾讯QQ游戏无线平台将亮相长城会
- mac 添加右键 复制路径到剪贴版
- 新知实验室--腾讯云TRTC体验
- java聊天程序_java基于C/S模式实现聊天程序(客户端)
- 回望2022,依然值得仰望星空
- Tomat报错 The APR based Apache Tomcat Native library which allows optimal performance in production
- linux用pwd转换到系统目录,详细讲解Linux系统中pwd命令的使用技巧
- Jenkins卸载方法