summer14

文件修复

文件损坏原因

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)

爆破得到文本内容:

  

 

posted on 2023-04-24 11:30  summer14  阅读(261)  评论(0编辑  收藏  举报

导航