文章目录

  • 预备知识
      • 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实现文件提取相关推荐

  1. 深度学习和目标检测系列教程 8-300:目标检测常见的标注工具LabelImg和将xml文件提取图像信息

    @Author:Runsen 图像标注主要用于创建数据集进行图片的标注.本篇博客将推荐一款非常实用的图片标注工具LabelImg,重点介绍其安装使用过程.如果想简单点,请直接下载打包版(下载地址见结尾 ...

  2. Wallpaper Engine pkg壁纸文件提取工具

    简介: RePKG-GUI 基于RePKG开发,适用于Wallpaper Engine壁纸的用户,可以帮助用户轻松下载Wallpaper Engine中的壁纸图片,让用户可以获取到自己喜欢的壁纸,软件 ...

  3. php实现文件管理系统,基于php的文件管理系统程序设计与实现

    技术与市场2013年第卷第6期 技术研发 基于php的文件管理系统程序设计与实现 熊燕1,曹晓峰2 (1.达州职业技术学院,四川达州635仪2,达州市人事考试中心,四川达州635仪) 摘要:随着行政管 ...

  4. 基于网站html文件查找恶意外链

    恶意外链|基于网站html文件查找恶意外链 声明:刚入门Python,第一次发文,分享学习,不足之处请大佬点评.本文内容仅供参考,未经允许不得转载. 0x00 前言 恶意外链存在形式多样,并没有一个具 ...

  5. linux拷贝音频文件,安装 CD 音频文件提取工具 Flacon

    Flacon 是一款 Qt 工具,用于从音频 CD 中提取个人曲目,基于在CUE文件中提供的信息提取如 WavPack. APE. FLAC. WAV 或 True Audio. 该应用程序提供了输出 ...

  6. Wireshark抓取的数据包文件提取

    (第一种方法 直接使用wireshark自带的导出) 分离图片文件) wireshark在指定的数据流中提取文件很简单.先选中要提取文件的数据包.wrieshark都会标明文件的类型.所以我们也就能够 ...

  7. 基于聚类的方法提取关键帧

    基于聚类的关键帧提取法       会弹出这几幅关键帧的图像       程序中的基本思路: 1.以第一帧图像的R,G,B直方图为初始质心,获取第一幅图像的R,G,B三幅图像的直方图,为1*256的矩 ...

  8. 基于php下载文件的详解

    基于php下载文件的详解 本篇文章是对php下载文件进行了详细的分析介绍,需要的朋友参考下 php下载文件,比如txt文件. 出现的效果就是,弹出浏览器自带的下载框,出现另存为操作.有时候会出现内存溢 ...

  9. scp 命令 路径_基于SSH的文件传输:scp命令

    日常开发中,经常需要在服务器和本地之间进行文件传输.这里来介绍一种基于SSH的文件传输方法--scp命令 命令格式 scp(secure copy,remote file copy program), ...

最新文章

  1. 游客功能怎么实现 php,php链式操作的实现方式分析
  2. 梦有感 2009-10
  3. C++ string清空并释放内存空间的两种方法(shrink_to_fit()、swap())
  4. android在屏幕最下方,如何将view固定在屏幕底部?
  5. AI学习与进阶实践-基于行业价值的AI学习与进阶路径
  6. iphone已停用解锁大概多少钱_【待办清单工具之三】微软To Do amp; iPhone提醒事项-来自大厂的时间管理系统...
  7. MySQL 5.6 5.7最优配置文件模板
  8. C++——构建单链表的方法
  9. 重装jdk后运行java程序出现Error: could not open `C:\Program Files\Java\jre68\lib\amd64\jvm.cfg'的解决办法
  10. String类基础的那些事!
  11. 这九年来都在干嘛-兄弟连IT教育
  12. 对象转json时,Date类型字段处理。
  13. 腾讯无线副总李颖:腾讯QQ游戏无线平台将亮相长城会
  14. mac 添加右键 复制路径到剪贴版
  15. 新知实验室--腾讯云TRTC体验
  16. java聊天程序_java基于C/S模式实现聊天程序(客户端)
  17. 回望2022,依然值得仰望星空
  18. Tomat报错 The APR based Apache Tomcat Native library which allows optimal performance in production
  19. linux用pwd转换到系统目录,详细讲解Linux系统中pwd命令的使用技巧
  20. Jenkins卸载方法

热门文章

  1. 【VC皮肤】破解版skin++皮肤库使用
  2. 听书阅读功能小程序开发
  3. 马云回忆往昔:改变人生从走出国门开始
  4. List集合(存放有序可重复队列)
  5. 怎么禁用笔记本键盘 ,一键式启动关闭。
  6. 强力推荐,SpringBoot + Vue + MyBatis 音乐网站项目
  7. php think cron,【自定义指令】实现 think-crontab 计划任务
  8. 肥仔问题杂记--短信发送失败-触发分钟级流控Permits:1
  9. HashMap原理详解
  10. python入门之爬虫------抓取王者荣耀英雄列表