题目
知识点
png图片文件结构,图片隐藏文件,foremost分离,压缩包解密,CRC32爆破,图片尺寸修复
解题步骤
下载下来是file.png,首先用notepad++打开,搜索flag发现文末惊喜,猜测图片还包含文件
用foremost提取出来,又得到一个png图片,一个压缩包,发现压缩包解压需要密码
压缩包解压刚开始使用360压缩打开一直不出现CRC32提示值,之后下载winrar打开出现CRC32提示值(要哭了)
破解压缩包的几种方式(zip伪加密 爆破 CRC32碰撞 已知明文攻击)
crc32爆破:
压缩包压缩文件会附带crc32校验码,如果字节长度比较短的话,可以尝试crc32爆破。
比方说字节长度只有1的话,可以计算所有的字符的crc32码来比较是否有相同的
每个文件都有唯一的CRC32值,即便数据中一个bit发生变化,也会导致CRC32值不同。若是知道一段数据的长度和CRC32值,便可穷举数据,与其CRC32对照,以此达到暴力猜解的目的。但通常只适用于较小文本文件。
CRC的全称是循环冗余校验(Cyclic Redundancy Check, CRC),用来校验文件是否出错但并不能用于自动纠错。
看到这几个文件便猜到需要进行CRC32爆破了
CRC32爆破脚本https://github.com/theonlypwner/crc32
使用方法
python crc32.py reverse 你的crc32密文
这里只举一个例子,crc32值为1d9f11e5,前面加上0x变成16进制
依次得到Awsd2021mzy0
根据提示图片真实crc值,将分离出的png图片用010Editor打开修改正确的CRC值,F5运行发现提示CRC错误,这里我们已经修改正确了,那应该就是图片尺寸不符,接下来获取正确的图片尺寸。
用脚本计算一真实的图片尺寸
import os
import binascii
import struct
crcbp = open("xxx.png", "rb").read() #打开图片
for i in range(2000):
for j in range(2000):
data = crcbp[12:16] + \
struct.pack('>i', i)+struct.pack('>i', j)+crcbp[24:29]
crc32 = binascii.crc32(data) & 0xffffffff
if(crc32 == 0x59f1d4be): #图片当前CRC
print(i, j)
print('hex:', hex(i), hex(j))
在010中修改正确的图片尺寸
保存后打开得到一张带二维码的图片(微信和QQ还扫不出来,百度扫的)
获得密码最后一段9070yo,最终密码Awsd2021mzy09070yo,解压后打开flag.txt获得flag
对于小白的我看着网上的方法做这道题都挺难的,遇到好多问题花费好久呜呜