文件修复
文件损坏原因
1、文件的编码方式出错(file -i查看文件编码)
2、文件格式出错(file -i查看文件格式)
3、文件签名有问题
修复文件的方式
针对文件损坏的原因采取对应的修复方案:
编码方式出错:
普通文本文件:文件另存为->选择编码方式
文档文件:文件另存为->web选项->选择编码方式
图片:图片的编码方式有文本、二进制、base64,根据需求对原来的文件进行编码/解码
文件格式出错:重命名,修改后缀名
文件签名出错:十六进制编辑器修改文件签名
1、文件签名(文件头)修复
file_repair.zip,文件地址链接:https://pan.baidu.com/s/1CSVN2OMvXF3izyAusxl3pw 密码:ok1z
解压得到名为pic的文件
查看文件类型,属于二进制文件
HxD打开,发现IHDR数据块
IHDR是PNG文件格式中的一个数据块,它是文件头数据块,包含了PNG文件中存储的图像数据的基本信息,如宽度、高度、位深度、颜色类型等。它必须作为第一个数据块出现在PNG数据流中,而且一个PNG数据流中只能有一个IHDR数据块。
因此该文件是PNG文件,添加文件头(在头部插入89504E47)如下:
另存为pic.png,成功还原图片
2、图片宽高修复
上面得到的图片并不完整,高度的值应该比现在的大
PNG格式图片的高度值存储在IHDR数据块的9-12个字节,用四个字节表示。
快速定位高度值:把十进制的"680"转为十六进制‘0x2A8’,对应的四个字节表示为:"00 00 02 A8",HxD搜索可知
修改成比000002A8大的十六进制值,可以改成与高度同等大小的"00 00 04 7B"
另存为pic2.png,可以看到flag
3、CRC校验修复
每个文件都有唯一的CRC32校验码,改变文件内容,校验码也会发生变化,文件大小比较小的文本文件可碰撞还原出文件内容。
bugku:好多压缩包
共有68个压缩包。每个压缩包都有名为"data.txt"的文本文件,且文件大小为4字节。使用CRC碰撞可还原出文本文件内容。
#!/usr/bin/env python3
import zipfile
import binascii
def get_content(crc):
for z in range(32, 127):
for j in range(32, 127):
for k in range(32, 127):
for m in range(32, 127):
test_str = chr(z) + chr(j) + chr(k) + chr(m)
if (binascii.crc32(test_str.encode()) & 0xFFFFFFFF) == crc: ##为什么要&0xFFFFFFFF:binascii.crc32返回的是一个有符号整数,即返回值可能是负数,这时需将其转为正数。而且可以保证计算出的CRC32是32位
return test_str
result = ''
for i in range(68):
filename = 'out' + str(i) + '.zip'
f = zipfile.ZipFile(filename, mode = 'r')
zip_info = f.getinfo("data.txt")
crc = zip_info.CRC
result += get_content(crc)
print(result)
爆破得到文本内容: