云计算百科
云计算领域专业知识百科平台

Misc入门Day3:PNG 的四种“死法“,以及怎么一眼看出它被改过

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */
#content_views .toc,
/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */
#content_views.markdown_views > p:empty:has(+ .toc),
#content_views.markdown_views > .toc + p:empty,
/* 富文本旧版目录标记 */
#content_views.htmledit_views #main-toc,
#content_views.htmledit_views #hr-toc,
#content_views.htmledit_views p[id*=\”-toc\”] {
display: none !important;
}
/* 目录去掉后,紧跟的首个标题不再多出一块上边距 */
#content_views.markdown_views > .toc + h1,
#content_views.markdown_views > .toc + h2,
#content_views.markdown_views > .toc + h3,
#content_views.markdown_views > .toc + h4,
#content_views.markdown_views > .toc + p:empty + h1,
#content_views.markdown_views > .toc + p:empty + h2,
#content_views.markdown_views > .toc + p:empty + h3,
#content_views.markdown_views > .toc + p:empty + h4 {
margin-top: 0 !important;
}

 图片题 90% 的信息在文件头和块结构里,不在图里。所以今天的目标就是:

1.看懂PNG的结构,

2.认得四种被动过的现象,

3.会修被改高度的图。

今天涉及的所有的识图工具均由AI生成如下图,今天没有涉及到工具或者环境的下载或安装:

一.PNG骨架

1.1PNG不是一整块数据,而是一串拼接起来的“块”,每块的构造一模一样:

类似于:【4字节长度】【4字节长度】【N字节数据】【4字节CRC】。

点击Misc.bat,然后输入3,enter,进入读取图片PNG的界面,如下图:

然后将系统生成的正常图片复制进刚才的图片读取界面,正常图片读取的结果如下图:

由上图可以观察到正常图片的各种信息,PNG四个块的分工分别是:1.IHDR,图像头,固定13字节(13组16 进制字符),前8字节是宽和高,改高度是CTF中常见的问题;2.IDAT真正的像素数据,zlib(zlib 是一套免费、开源、无损压缩库)压缩过;3.tXEt,文本信息,用来写作者,注释;4.IEND结束标志,必须是文件的最后一个块。

1.2为什么CRC是关键?

因为当文件里的CRC==重算的CRC——系统报OK;

但当有人改了块内容但没改CRC——系统报BAD;

所以安装之前设计好的计划,今天不用学会算CRC,只要会看,或者心里知道:只要CRC报BAD,iu立刻知道这个块被动过。

二.四种“死法”

以下所有涉及到的例子图片均由AI生成

2.1:flag直接躺在tEXt里

这属于明文文本类,是最直接,最简单的一种,选择这个Normal的图片,通过读取图片的tEXt内容,直接可以找到明确的Flag,如下图:

看上面图片里读取出来的信息,有效信息就是: flag{this_is_in_a_tEXt_chunk}。

2.2:高度被改(最经典)

看到这个tampered_height.png图片,它是有一部分缺失的,我们尝试读取它的关键信息,如下图:

我们观察到CRC报了BAD,所以我们判断出来这个图片被改过,再看是IHDR出现了错误,所以图片被动的是头部,而不是像素,图片能打开,但明显由缺陷的,这就是题目特征,然后利用工具改正确的高度,(今天的计划里不要求手改高度,而是用工具),所以我们使用工具修改图片,生成第五张图片。再次打开,读取信息,发现如下图:

我们看到图片完整出现,CRC也没报BAD,而是OK,说明改好了。

2.3:IEND后面藏东西

我们先说结论:IEND结束位置==文件大小证明文件就是干净的,否则就说明后面有货。

我们看png_with_zip.png这个照片,有以下信息

接下来分析:

首先PNG的签名固定是8字节,然后我们看到这里的IHDR长度是13,那我们就可以算出IHDR占几个字节:4+4+13+4=25由此类推,IDAT占4+4+261+4=306字节,IEND长度是0,我们就算它占4+4+0+4=12字节,然后算出整体占8+25+306+12=351字节,然后根据图片信息,该图片的长度是492字节,对比发现该图片长度和352的IEND不相等,所以判断有私货。492-352=141字节,所以这就是IEND后面藏东西。

2.4:文件头被改

前提条件,图片想要正常打开,文件头必须是固定的:89 50 4E 47 0D 0A 1A 0A,这文件头必须是固定的,一个字都不能改。接下来,我们看第一张图片,如下图:

我们尝试分析文件的信息,按照常规步骤操作,得出以下结果:

我们看到上面显示的PNG签名不正确,再仔细观察,发现该文件中的签名是 89 50 4E 47 0D 0A 1A 00,最后的字符00和我们上面所规定的固定签名0A不一样,所以由此判断,PNG签名不正确就是文件图片打不开的原因。

以上就是常见的四种死法。

三.CRC BAD 在 IHDR 和 IDAT,是两件事

IHDR里装的是13字节参数,包括宽高,位深等,IDAT里装的是压缩过的像素参数。IHDR报错是读法错了,打不开或者颜色乱;IDAT报错是画面局部花掉,或者完全看不出异常。

IHDR报错可以修复,IDAT报错一般不能修复。

四.图片题排查步骤

  • file/看PNG头8字节是不是89 50 4E 47 0D 0A 1A 0A;
  • Strings/findstr扫明文,看有没有Flag;
  • 看CRC是否报BAD,且看在哪出现的BAD;
  • 看IEND之后有没有残留,就是解题关键。
  • 以上就是今天博客的内容,今天主要就是学到了三点:

  • 图片题的线索在结构和字节里,不在像素里;
  • CRD BAD说明块被改过,BAD在IHDR要修,BAD在IDAT要拆;
  • IEND结束位置<文件大小——尾部有问题。
  • 赞(0)
    未经允许不得转载:网硕互联帮助中心 » Misc入门Day3:PNG 的四种“死法“,以及怎么一眼看出它被改过
    分享到: 更多 (0)

    评论 抢沙发

    评论前必须登录!