admin
在河师大与CTF邂逅之图片隐写
自从迷上了CTF之后就一发不可收拾,所以当我听说学习CTF最好的方法是做题,就开始在各大靶场像Bugku、CTFshow、攻防世界之类的CTF平台开始从比较简单的Web方面刷题。两天下来开始积累了一些题型的解法,不过有些发愁平台上同一类型的题太少,找个同类型的题还需要跨平台去找。
在几位大师傅的努力下,持续五天的河师大第一场CTF线上比赛就要开始了。我报了个名,在比赛第一天迫不及待地进入系统开始了刷题之路。
---
这真的不是一张普通的图片啊
做了一个星期的CTF题之后,Misc类型的图片题目让我又爱又恨,比较常见有PNG图片,JPG图片,GIF图片。
其中GIF图片通常涉及逐帧分离,后续操作等等。JPG、PNG图片通常修改图片尺寸,图片隐写术等等。后续我们要重点注意的就是修复被修改尺寸的PNG和JPG图片,这次就拿这第一题来举个栗子。
题目给的是一张再经典不过的照片了,话说这不是Windows xp的默认壁纸吗。。。
首先这是一张1.21MB的 JPG 图片(这个大小估计是正常的),先打开属性记下宽度和高度,查看下详细信息,有可能是后续解题步骤所需信息或者Hint,例如可能是后续隐写压缩文件的解压密码等等(这张图啥都没有)。
虽然这个大小属于正常范围,但还是检查一下有没有夹带私货吧。这里尝试对图片进行下分离,看看有没有什么东西隐藏在里面。
在Linux中file命令、binwalk命令都可以用来分析文件
为了方便使用Linux上的工具,我在本地启用了WSL2(适用于 Linux 的 Windows 子系统),又搭建了一台运行Ubuntu20.04的虚拟机,还把我的阿里云轻量应用服务器划出一部分用。
file 要检查类型的文件binwalk 要检查类型的文件
如果发现有夹带私货,我们可以用binwalk或者foremost来进行分离
binwalk -e 要分离的文件foremost -i 要分离的文件
在这张图片中我并没有分离出来什么其他文件,所以我们只能继续往下走,拿出我们的神器stegsolve,可以用来帧查看,切换颜色通道,处理LSB隐写等等。
- File Format:文件格式
- Data Extract:数据提取(常用来处理LSB隐写)
- Steregram Solve:立体试图 可以左右控制偏移
- Frame Browser:帧浏览器
- Image Combiner:图像合并(如果题目给出多张图片,可以将两张图片进行XOR、OR、AND等操作,有时候两张图片异或运算后神奇地出现了一个二维码!)
原版一般主流工具包中都有 网络上也比较容易找到
我们从四个颜色通道挨个查看,找可能隐藏flag的图层
但是这张里面没有,我翻遍了所有的颜色通道,得到的图片越来越奇怪。。。
虽然在这道题上没发挥出作用,但是stegsolve一般可以在逐帧查看GIF时比较好用。
然后我们尝试着把图片用16进制查看器打开,像010 Editor 或者是Winhex,打开后可以ASCII搜索“flag”、“key”或者其他题目提示信息。(在这道题里还是搜不到)
然后我们拿出小本本上刚开始时记录的图片宽和高,利用在线工具进制转换成16进制,然后在Hex里面搜索,如图即为这张JPG存宽高的位置。
然后我们把高度修改为和宽度相同,图片就变成了正方形,我们终于看到了隐藏的flag——就在扩展出的下一半上。
PNG数据块(Chunk)
PNG文件格式中的数据块
|
||||
数据块符号
|
数据块名称
|
多数据块
|
可选否
|
位置限制
|
IHDR
|
文件头数据块
|
否
|
否
|
第一块
|
cHRM
|
基色和白色点数据块
|
否
|
是
|
在PLTE和IDAT之前
|
gAMA
|
图像γ数据块
|
否
|
是
|
在PLTE和IDAT之前
|
sBIT
|
样本有效位数据块
|
否
|
是
|
在PLTE和IDAT之前
|
PLTE
|
调色板数据块
|
否
|
是
|
在IDAT之前
|
bKGD
|
背景颜色数据块
|
否
|
是
|
在PLTE之后IDAT之前
|
hIST
|
图像直方图数据块
|
否
|
是
|
在PLTE之后IDAT之前
|
tRNS
|
图像透明数据块
|
否
|
是
|
在PLTE之后IDAT之前
|
oFFs
|
(专用公共数据块)
|
否
|
是
|
在IDAT之前
|
pHYs
|
物理像素尺寸数据块
|
否
|
是
|
在IDAT之前
|
sCAL
|
(专用公共数据块)
|
否
|
是
|
在IDAT之前
|
IDAT
|
图像数据块
|
是
|
否
|
与其他IDAT连续
|
tIME
|
图像最后修改时间数据块
|
否
|
是
|
无限制
|
tEXt
|
文本信息数据块
|
是
|
是
|
无限制
|
zTXt
|
压缩文本数据块
|
是
|
是
|
无限制
|
fRAc
|
(专用公共数据块)
|
是
|
是
|
无限制
|
gIFg
|
(专用公共数据块)
|
是
|
是
|
无限制
|
gIFt
|
(专用公共数据块)
|
是
|
是
|
无限制
|
gIFx
|
(专用公共数据块)
|
是
|
是
|
无限制
|
IEND
|
图像结束数据
|
否
|
否
|
最后一个数据块
|
PNG数据块结构
PNG文件中,每个数据块由4个部分组成,如下:
名称
|
字节数
|
说明
|
Length (长度)
|
4字节
|
指定数据块中数据域的长度,其长度不超过(231-1)字节
|
Chunk Type Code (数据块类型码)
|
4字节
|
数据块类型码由ASCII字母(A-Z和a-z)组成
|
Chunk Data (数据块数据)
|
可变长度
|
存储按照Chunk Type Code指定的数据
|
CRC (循环冗余检测)
|
4字节
|
存储用来检测是否有错误的循环冗余码
|
CRC: 一种校验算法,仅仅用来校验数据的正确性的