关于CTF图片隐写的一些总结

隐写大法好

Posted by kevin on November 26, 2019

preface

这几天做了一下 BUUCTF 的杂项题,里面有很多都是图片隐写题,也有很多是重复的知识点,所以这里总结一下常用的做题套路,一般的题目解法大概都是下面几步。

0x01 查看详细信息

之前经常有文章说自己拍的图片不要随便发,黑客可以获取拍照的位置,其实就是因为照片中会留下一些信息,我们可以在详细信息中看到,可能就会有题目将一些关键的信息放在这里

Einstein.jpg

0x02 查看十六进制

直接将图片拖到十六进制编辑器中就可以查看到图片中的 ASCII 码,很多题目都会将信息隐藏在这里面,windows 底下一般常用的就是 winhex 这个软件

base64

0x03 图片截断

有时候下载下来的图片是被截断的,有一部分东西被隐藏了起来,这时我们就可以修改图片的宽或高看看是否有信息被截断。一般图片的数据块都是做了规定的,只要上网搜索一下就知道图片的宽或高在图片内存的哪个部分,下面是维基百科的 png 格式的数据图:

  • 文件头数据块IHDR(header chunk):包含有图像基本信息,作为第一个数据块出现并只出现一次。
  • 调色板数据块PLTE(palette chunk):必须放在图像数据块之前。
  • 图像数据块IDAT(image data chunk):存储实际图像数据。PNG数据允许包含多个连续的图像数据块。
  • 图像结束数据IEND(image trailer chunk):放在文件尾部,表示PNG数据流结束。

一般情况下,如果图片被截断了的话,修改的是 IHDR 后面的数据,也就是长和宽的信息,比如下面是 png 格式图片的一些信息

ihdr.jpg

所以做这种题要知道图片的编码格式以及数据块代表的意义,我觉得还挺有意思的,把图片拖到十六进制编辑器中就可以查看一些很详细的信息,就能知道图片是从哪开始怎样结束的,果然,互联网上万物皆是二进制

hex

0x04 图片隐藏文件

第三点已经提到了,图片文件对于开始和结束都有起始标志位,要是在结束位之后再塞些东西图片处理器也不会将其视作图片的一般分处理,CTF 中经常在图片后面隐藏一个压缩包,我们可以通过 binwalk 这个工具(Linux下使用) 查看图片中是否隐藏了文件,然后用 foremost 命令将图片与隐藏信息分离

erweima.png

0x05 通道隐写

也有些题目在通道中隐藏了 flag ,我们可以用 stegsolve 来查看图片的每一个通道,png 格式图片的话会有 redbluegreenalpha 通道,简单点的题目可以直接在某个通道中看到 flag

blackcat.jpg

0x06 LSB 隐写

LSB(Least Significant Bit) 即是最低有效位,通常用来对 png 进行隐写,原理就是 png 一般由 RGB 三个通道组成,每个通道 8bit,因此能够表达的颜色有 256*256*256=16777216 种之多,人眼不能辨别这么多种颜色,因此修改 RGB 颜色分量的最低二进制位的信息后人眼是观察不到区别的(如果修改其他位的话可能会被肉眼可见)

因此,每一个像素都有三个通道,可以修改 3 个 最低位的 bit ,那么在 ctf 题目中,一般判定方法是用 stegsolve 来打开图片,通过 Data Extract 功能来提取出每个通道的最低位,看看是否隐藏了东西,下面这题就在最低位藏了一张 png 图片

lsb.jpg

save bin 保存为 png 格式得到一张二维码的图,扫描即可得到 flag

image.png

0x07 双图隐写

假如题目给了两张图,那么大概率就是双图隐写了,因为一张图片得到的信息不够,一般要对两张图片进行一定操作才能拿到 flag ,比如求异或之类的,这里是高校信息安全运维赛的一道题目

twocats.jpg

他这里其实用到了盲水印,因此需要一张保留了原始信息的原图,另外一张是注入了盲水印后的图,所以用 GitHub 上开源的这款工具就能够找出图片中的信息(眼睛看瞎了)

flag

reference

https://www.tr0y.wang/2017/06/07/CtfMiscStega/index.html