一切的一切,都要从这道题说起……

题源ctf.show:https://ctf.show/challenges#stega12

image-20200717104706413

下载附件,只有一张图片,后缀为png格式,用010editor查看并不能找到什么由出题人写入的额外的信息,而常见的png隐写方式zstegLSB,经过我的各种尝试,也无法解出任何信息,一时间想不到该怎么解这道题,在网上也查不到有关该题的wp,于是我点开了solved列表,刚好在里面发现了一个熟悉的名字

image-20200717105620051

于是我便向或或大师询问此题,在大师一番回想后,灵光乍现,告诉我把图片拖进chrome浏览器就可以看到flag,于是我把图拖了进去

image-20200717110113878

真是非常的amazing啊!flag一下就从图片中出现了!正当我在想为什么的时候,或或大师又告诉我:apng文件……

--------------------------------------------------------------(我是正文分割线)----------------------------------------------------------------

什么是apng文件

摘自维基百科

APNGAnimated Portable Network Graphics格式PNG位图动画扩展,但未获PNG组织官方认可。其扩展方法类似GIF 89a,仍对原版PNG保持向下兼容。APNG第1帧为标准PNG图像,剩余的动画和帧速等数据放在PNG扩展数据块,因此只支持原版PNG的软件会正确显示第1帧。APNG与Mozilla社区关系密切,格式标准文档设在Mozilla网站。

用简单的话来概括上面的内容,APNG就是一种动图形式(可以动)的PNG文件,和GIF文件类似。

这种格式文件的出现,其实是为了代替GIF,但是在当时,由于缺乏浏览器对此种格式文件的支持(主要原因),导致这种文件最终没有像GIF一样被普及,当然现在已经有很多浏览器支持浏览这种文件,比如Chrome、Firefox、Safari等,这也是我们用Chrome浏览器打开图片可以看到flag的原因

结合本题谈一谈

apng文件可以向下兼容为png,如果在不支持apng浏览的图片浏览器上查看apng文件,就会把它当成png来查看,并且只会显示动图的第一帧,所以我们直接查看本题的图片无法看到flag,因为含有flag的图片并不是第一帧

image-20200717114832843

只从表面来看,我们无法直接看出apng与png到底有什么差别,所以我们来看一看两种文件的组成

apng与png文件组成对比

png的组成

首先我们简单了解一下png文件构成,正常的png由文件署名块及数据块(chunk)组成,数据块又分为关键数据块(critical chunk)及辅助数据块(ancillary chunks),辅助数据块我们在此暂且不提,我们只看关键数据块,关键数据块中有四个标准数据块:

  • 文件头数据块IHDR(header chunk)
  • 调色板数据块PLTE(palette chunk)
  • 图像数据块IDAT(image data chunk)
  • 图像结束数据IEND(image trailer chunk)

我们用TweakPNG来查看上面这个比较标准的png图片

image-20200717123306756

可以很清晰地看到四个关键数据块的存在及大小,接下来我们再探讨apng的文件组成

apng的组成

下图中是一个png文件的简要组成(略去了PLTE块)

image-20200717120306600

而apng在png的基础上,引入了三个新的数据块,分别为:acTL(动画数据块)、fcTL(帧控制块)、fdAT(帧数据块),下图是三个独立的png文件组成apng的示意图

  • acTL 块必须在第一个 IDAT 块之前,用于告诉解析器这是一个动画 PNG,包含动画帧总数和循环次数的信息
  • fcTL 块是每帧都必要的,出现在 IDAT 或 fdAT 之前,包含顺序号、宽高、帧位置、延时等信息
  • fdAT 块与 IDAT 块有着相同的结构,除了 fcTL 中的顺序号

从图中可以发现第一帧与后面两帧不同,因为第一帧的apng文件储存的是一个正常的png的IDAT数据块,因此对于不支持apng文件浏览的浏览器或工具,只会显示第一帧而忽略后面几帧的动画,这也是apng可以向下兼容为png的原因。

结合本题所给的图,用010editor来查看几个关键字,可以分别在4Bh、530Ah两个位置找到fcTL,在5330h、D340h两个位置找到fdAT,用TweakPNG查看也可以清晰地看到

image-20200717125524150

和上面png的图作对比,也可以发现多出了很多png不具有的块

但是从我看来,这道题的apng还有些问题,我们可以从上图中看到只有两个fcTL块,也就是说理论上来讲应该只有一个fdAT块,所以我认为最后一个fdAT块是多余的,应该不会被识别到,我使用工具将本题的apng转换成了gif,得到的gif只有两帧,也证明了我刚提到的观点(大概2333)

总结

一道看似简单的隐写题引出了如此大的学问,要不是这道题,我可能到很久之后还不会了解到有apng这种文件,也更不会想到有这种隐写方式,这道题给我提供了很好的做题以及出题思路,以后做有关png的隐写,可以遇事不决就拖进浏览器看一看了2333

参考文章