TypechoJoeTheme

Assassin logo

admin

网站页面
类目归类
标签搜索

在河师大与CTF邂逅之图片隐写

自从迷上了CTF之后就一发不可收拾,所以当我听说学习CTF最好的方法是做题,就开始在各大靶场像Bugku、CTFshow、攻防世界之类的CTF平台开始从比较简单的Web方面刷题。两天下来开始积累了一些题型的解法,不过有些发愁平台上同一类型的题太少,找个同类型的题还需要跨平台去找。

在几位大师傅的努力下,持续五天的河师大第一场CTF线上比赛就要开始了。我报了个名,在比赛第一天迫不及待地进入系统开始了刷题之路。

---

这真的不是一张普通的图片啊

做了一个星期的CTF题之后,Misc类型的图片题目让我又爱又恨,比较常见有PNG图片,JPG图片,GIF图片。

其中GIF图片通常涉及逐帧分离,后续操作等等。JPG、PNG图片通常修改图片尺寸,图片隐写术等等。后续我们要重点注意的就是修复被修改尺寸的PNGJPG图片,这次就拿这第一题来举个栗子。

题目给的是一张再经典不过的照片了,话说这不是Windows xp的默认壁纸吗。。。

首先这是一张1.21MBJPG 图片(这个大小估计是正常的),先打开属性记下宽度和高度,查看下详细信息,有可能是后续解题步骤所需信息或者Hint,例如可能是后续隐写压缩文件的解压密码等等(这张图啥都没有)。

虽然这个大小属于正常范围,但还是检查一下有没有夹带私货吧。这里尝试对图片进行下分离,看看有没有什么东西隐藏在里面。

Linuxfile命令、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: 一种校验算法,仅仅用来校验数据的正确性的

朗读
赞(8)
版权属于:

Assassin

本文链接:

https://dogge.top/index.php/archives/4/(转载时请注明本文出处及文章链接)

评论 (0)

人生倒计时

今日已经过去小时
这周已经过去
本月已经过去
今年已经过去个月