一切的一切,都要从这道题说起……
题源ctf.show:https://ctf.show/challenges#stega12
下载附件,只有一张图片,后缀为png格式,用010editor查看并不能找到什么由出题人写入的额外的信息,而常见的png隐写方式zsteg、LSB,经过我的各种尝试,也无法解出任何信息,一时间想不到该怎么解这道题,在网上也查不到有关该题的wp,于是我点开了solved列表,刚好在里面发现了一个熟悉的名字
于是我便向或或大师询问此题,在大师一番回想后,灵光乍现,告诉我把图片拖进chrome浏览器就可以看到flag,于是我把图拖了进去
真是非常的amazing啊!flag一下就从图片中出现了!正当我在想为什么的时候,或或大师又告诉我:apng文件……
--------------------------------------------------------------(我是正文分割线)----------------------------------------------------------------
什么是apng文件
摘自维基百科:
APNG(Animated 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的图片并不是第一帧
只从表面来看,我们无法直接看出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图片
可以很清晰地看到四个关键数据块的存在及大小,接下来我们再探讨apng的文件组成
apng的组成
下图中是一个png文件的简要组成(略去了PLTE块)
而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查看也可以清晰地看到
和上面png的图作对比,也可以发现多出了很多png不具有的块
但是从我看来,这道题的apng还有些问题,我们可以从上图中看到只有两个fcTL
块,也就是说理论上来讲应该只有一个fdAT
块,所以我认为最后一个fdAT
块是多余的,应该不会被识别到,我使用工具将本题的apng转换成了gif,得到的gif只有两帧,也证明了我刚提到的观点(大概2333)
总结
一道看似简单的隐写题引出了如此大的学问,要不是这道题,我可能到很久之后还不会了解到有apng这种文件,也更不会想到有这种隐写方式,这道题给我提供了很好的做题以及出题思路,以后做有关png的隐写,可以遇事不决就拖进浏览器看一看了2333
info 评论功能已经关闭了呐!