
当文件出现损坏时,使用file这种基于文件签名(magic)的命令已经无法识别出这是一个什么文件,而返回值是data文件。(因为只改后缀而不改内容,file依旧会识别真实类型。不过返回data也可能是因为未知格式、加密/压缩数据、文件头前有垃圾)
这种题目则需要我们去依据文件头修复文件,使用010直接补充上文件头即可,这是杂项题中文件识别的基本题。
当然,在MISC题型中,故意损坏文件不仅仅会出现在图片中,还可能出现在压缩包、PDF、磁盘镜像文件中。本质就是出题者故意修改损坏文件头/文件尾/关键字段,使得工具无法识别,我们需要先行把他修改为正常结构,再继续寻找flag。
这里不对其他文件作说明拿到图片后可以按照这个顺序来试着判断是否是直接附加或修复题 file 文件名 # 返回data或类型不正确 xxd 图片 | head # 看前 16 字节文件头 xxd 图片 | tail # 看文件尾 strings -n 6 图片 | grep -iE ‘flag|ctf|key’ # 扫明文 pngcheck -v 图.png # PNG 专用:块结构/CRC
如果 file 返回 data,但文件大小正常、strings 有可疑内容,大概率是文件头被破坏,不是加密。
更进一步,则是会嵌套写入一个或多个文件,如图片,压缩包等。
从图片修复来说,有四个方面如下:
- 文件头修复
- 文件尾修复
- PNG宽高/CRC校验修复
- JPEG/GIF头尾修复
- 多文件合并
文件头与文件尾直接查表对应,通过010进行修改即可。 CRC 全称 (Cyclic Redundancy Check),循环冗余校验。它是根据一段数据算出来的固定长度“校验值”,用来检测数据有没有被改动或传输出错。
一旦文件的宽高等数据被修改,CRC一定会错,不过CRC出错,却不一定是宽高被改,也可能是CRC被单独修改,只要注意这点,根据原理两者大可论为一谈。
pngcheck -v 报 CRC 错误,就说明这个块的数据被改过,或者 CRC 本身被改过,大概率就是文件修复题。
不过区分两种情况
-
只改了 CRC 值:数据是好的,CRC 被故意改坏 → 使用TweakPNG 直接重算 CRC 即可。
-
改了数据(如宽高)导致 CRC 错误:要先恢复数据,再重算 CRC;只修 CRC 没有作用。
甚至有时候出题者给你一张图片,但是喜欢绕弯,硬是将一份文件砍成三四份再发(还有一个md的值用于计算文件的完整性),那么此时就需要合并文件。在linux下,可以使用cat(查看文件)关键词查看文件,合并成一份。
文件合并方法: 例: cat 文件名 文件名 文件名…… > 合并后文件名 然后使用md5sum 文件名 来查看文件md5值,进行核对,便知成功与否。
windows下则使用copy来进行合并文件,使用dir可以查看文件。 格式:copy /B 文件1+文件2 合并后文件名 windows下计算md5命令:certutil -hashfile 文件名 MD5
工具:
TweakPNG 是一款简易的PNG图像浏览工具,用于查看和编辑 PNG 的 chunk 结构:块类型、长度、CRC,支持删除/修改块和重算 CRC。
适用场景:文件头正常却无法打开的文件,利用tweakPNG修改CRC
例:当png文件正常但无法打开文件,可能是CRC检验出错,用tweakPNG打开png,会弹出CRC校验错误的弹窗。
第一种,通过工具直接修改CRC校验值即可
第二种,需要借助python脚本,爆破宽高进行修复,然后再计算CRC校验值
这种题目再次进阶就不仅仅只是隐写图片了,而是其他的各种文件,如压缩包、pdf、word等