✨前言
今天我们想来介绍一下关于图片隐写相关处理,以及修复被修改尺寸的PNG图片。
关于PNG图片的相关处理,是CTF Misc图片隐写术中极为基础的一项操作,笔者这里是想要提一些做题过程中发现的小技巧。
✨CTF图片处理基本套路
各种图片类型
比较常见有PNG图片,JPG图片,GIF图片。
其中GIF图片通常涉及逐帧分离,后续操作等等。JPG、PNG图片通常修改图片尺寸,图片隐写术等等。后续我们要重点提的就是修复被修改尺寸的PNG图片。
检查详细信息
很多时候重要信息就隐藏在图片的详细信息内,有可能是后续解题步骤所需信息或者Hint,例如可能是后续隐写压缩文件的解压密码等等,所以睁大眼睛仔细看哦。
十六进制编辑器处理
万物皆文件,都可以用十六进制编辑器打开,这里笔者常用的十六进制编辑器是“010 Editor”,当然其他十六进制编辑器例如“WinHex”也是可以的。十六进制编辑器打开后仔细检查,可以ASCII搜索“flag”、“key”或者其他题目提示信息。
kali分析文件
kali中file命令、binwalk命令都可以用来分析文件
其中如下命令可以用来分离隐写文件
binwalk -e filename
foremost命令也可以用来分离隐写文件,有些binwalk无法分离的可以使用foremost命令尝试。
foremost filename
//反正笔者一般是binwalk分析文件,有隐写就直接用foremost分离文件。
如下图就分离出来隐写的两张图片和一个zip压缩包
当然其他还有zsteg工具、dd命令、手动分离等等。
神器stegsolve
stegsolve真可谓神器,可以用来帧查看,切换颜色通道,处理LSB隐写等等。
File Format:文件格式
Data Extract:数据提取(常用来处理LSB隐写)
Steregram Solve:立体试图 可以左右控制偏移
Frame Browser:帧浏览器
Image Combiner:图像合并(如果题目给出多张图片,可以将两张图片进行XOR、OR、AND等操作,有时候两张图片异或运算后神奇地出现了一个二维码!)
这里给出一个stegsolve modifed version Github链接
https://github.com/Giotino/stegsolve
//原版一般主流工具包中都有 网络上也比较容易找到
脑洞大开
CTF就是这样,50%的实力和50%的灵感,许多时候灵感是非常重要的。
✨修复被修改尺寸的PNG图片
再次放上blog的头图
PNG文件结构
参考:https://www.cnblogs.com/lidabo/p/3701197.html
CRC循环冗余检测比较常用,笔者在计算机网络中就有学到。
这里我们重点提一下文件头之后的数据块
就是说一张PNG图片第17个字节起的8个字节就表示了图片的宽度高度信息。
那么我们有什么方法可以判断一张PNG图片的尺寸被修改了呢?
//笔者在写blog的时候发现被修改尺寸的PNG图片在Typora中无法预览出图片,而是以markdown链接的形式,这算是个新发现吧。
Irfanview
IrfanView是适用于Windows XP,Vista,7、8和10的快速,紧凑和创新的FREEWARE(非商业用途)图形查看器。
这是笔者的默认图片查看器,主要是因为启动快,软件体积小,支持保存格式多等等。笔者也是在做题过程中发现,如果PNG图片被修改,用Irfanview打开时会有报错提示。
//win10的照片(系统自带的照片查看器)打开被修改尺寸的图片是不会有报错提示的。
TweakPNG
TweakPNG是用于检查和修改PNG图像文件的低级实用程序。它支持Windows XP及更高版本。为了充分利用它,您至少必须对PNG文件的内部格式有所了解。有关PNG的信息,请参见 PNG主页。
或者可访问该地址下载软件:http://entropymine.com/jason/tweakpng/
当使用TweakPNg打开被修改尺寸或者是其他信息的PNG图片时,会有提示。
提示CRC错误。
这里有两种可能
1)图片CRC被修改
可以尝试用十六进制编辑器打开图片,修改CRC。
2)图片尺寸被修改
这时候就要用十六进制编辑器修改图片尺寸了。
Python脚本计算正确的尺寸
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 == 0x38162a34): #图片当前CRC
print(i, j)
print('hex:', hex(i), hex(j))
这里的脚本是在一个非常火的CTF培训课程中了解到的
//原脚本长宽限制0~1023 笔者这里将其修改为2000防止图片尺寸过大没有遍历到
链接:https://www.bilibili.com/video/BV1Kt411j7r7
使用时修改脚本中的打开图片名称和图片当前CRC
然后在图片所在目录运行Python脚本
(或者填上要计算的图片的绝对路径,运行Python脚本)
我们这里修改后的脚本如下
然后运行脚本可得正确尺寸
然后我们再用十六进制编辑器复原图片尺寸
当当当!就复原PNG图片啦!
顺便也验证了笔者之前的猜想,PNG图片修改为原尺寸后Irfanview打开就不会报错。
233图是笔者自己P的 顺便安利《德鲁纳酒店》、《我的大叔》真的好看!!(跑题了...)
✨碎碎念
当然这只是图片隐写术中很小的一个知识点,但是或许可以拿去逗逗同学(?)
实战中一般笔者Irfanview打开如果有报错提示(表明PNG图片尺寸被修改),一般随缘修改下尺寸就行了,一般不会用Python脚本去爆破原始尺寸,解题速度要紧。