CTF—基于BinWalk实现文件提取

预备知识

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 AES

def 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}。

  • 3
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值