[CTF隐写]png中CRC检验错误的分析

最近接连碰到了3道关于png中CRC检验错误的隐写题,查阅了相关资料后学到了不少姿势,在这里做一个总结


题目来源:

  • bugku-MISC-隐写2
  • bugku-MISC-再来一道隐写
  • JarvisOJ-MISC-炫酷的战队logo

基础知识:

​ 先分析png的文件格式,用16进制编辑器010editor打开一张正常的png图片,逐字节分析如下:

前八个字节89 50 4E 47 0D 0A 1A 0A为png的文件头,该段格式是固定的

上图中高亮部分称为为chunk[0]段,可以分为以下几块:

  • 前四个字节00 00 00 0D(即为十进制的13)代表数据块的长度为13,数据块包含了png图片的宽高等信息,该段格式是固定的

  • 之后的四个字节49 48 44 52(即为ASCII码的IHDR)是文件头数据块的标示,该段格式也是固定的

  • 之后进入13位数据块,前8个字节00 00 05 56 00 00 03 00中:

    • 前四个字节00 00 05 56(即为十进制的1366),代表该图片的宽,该段数据是由图片的实际宽决定的

    • 后四个字节00 00 03 00(即为十进制的768),代表该图片的高,该段数据是由图片的实际高度决定的

      这8个字节都属于13位数据块的内容,因此数据块应再向后数5个字节,即为00 00 05 56 00 00 03 00 08 02 00 00 00

  • 剩余的4位40 5C AB 95为该png的CRC检验码,也就是本篇文章要重点讨论的地方,该段数据是由IDCH以及十三位数据块(即上文中的49 48 44 52 00 00 05 56 00 00 03 00 08 02 00 00 00)计算得到的

有了之上的基础知识,再来看大部分png中CRC检验错误的出题思路:

对一张正常的图片,通过修改其宽度或者高度隐藏信息,使计算出的CRC校验码与原图的CRC校验码不一致;windows的图片查看器会忽略错误的CRC校验码,因此会显示图片,但此时的图片已经是修改过的,所以会有显示不全或扭曲等情况,借此可以隐藏信息。

而Linux下的图片查看器不会忽略错误的CRC校验码,因此用Linux打开修改过宽或高的png图片时,会出现打不开的情况

以隐写2题目举例

在windows和Linux下分别打开图片,如下图,windows中可以打开,deepin系统显示为空白,因此猜测是该png的宽或高被修改导致CRC校验码错误

于是用010editor打开该png分析其字节信息,如下图

红框圈住的部分即为该png的宽和高,红圈圈住的部分为该png的CRC校验码,箭头部分为010editor的templete检测出了png的CRC错误

于是我们可以通过爆破图片修改前的宽和高来匹配CRC校验码,并用正确的宽和高来修复图片

为了做题的方便,先尝试爆破高度,脚本如下:


# -*- coding: utf-8 -*-
import binascii
import struct #\x49\x48\x44\x52\x00\x00\x01\xF4\x00\x00\x01\xA4\x08\x06\x00\x00\x00 crc32key = 0xCBD6DF8A
for i in range(0, 65535):
height = struct.pack('>i', i)
#CRC: CBD6DF8A
data = '\x49\x48\x44\x52\x00\x00\x01\xF4' + height + '\x08\x06\x00\x00\x00' crc32result = binascii.crc32(data) & 0xffffffff if crc32result == crc32key:
print ''.join(map(lambda c: "%02X" % ord(c), height))

运行脚本,输出000001F4,即原图片高度为00 00 01 F4爆破成功

因此我们用010editor修改png的高度为原高度,如下,并保存为新图片

此时我们发现deepin的图片查看器已经可以正常的打开图片了,说明我们修复成功

第二题与第一题类似,不再复述;第三题较前两题有所改变,留给大家动手实践


几点补充:

  • 判断是否为crc校验码错误的方法:

    • windows下图片可以打开,其他系统下图片不能打开
    • 使用010editor的template检测,这也是我16进制编辑器力推010editor的原因之一
    • 使用诸如tweakpng,pngcheck等工具
  • 修复png的crc检验码方法:

    • 本文中所列的爆破出正确的宽或高,并用16进制编辑器修复
    • 利用windows忽略crc检验码的特性,我们可以用tweakpng任意修改图片的宽和高,直至得到有用的信息,事实上,这是最快的方法

虽说在windows下使用tweakpng是最简单的方法,但还是建议大家在练习过程中通过编程来实现,毕竟对于程序员而言,最大的成就莫过于用自己写的代码来解决问题。

[CTF隐写]png中CRC检验错误的分析的更多相关文章

  1. 记一道CTF隐写题解答过程

      0x00 前言 由于我是这几天才开始接触隐写这种东西,所以作为新手我想记录一下刚刚所学.这道CTF所需的知识点包括了图片的内容隐藏,mp3隐写,base64解密,当铺解密,可能用到的工具包括bin ...

  2. CTF隐写——越光宝盒

    0x题目 原题来自于实验吧:http://www.shiyanbar.com/ctf/1992 一句话,和一个PNG图片. 0x解题 1.下载图片以后,发现打不开. 首先想到的就是文件头可能被修改了, ...

  3. 南邮CTF隐写之丘比龙的女神

    刚开始下载下图片来 习惯性的binwalk一下 没发现东西 formost一下也没分离出来 扔进c32asm中发现有nvshen.jpg 于是改后缀名字为.zip 解压nvshen.jpg发现无法解压 ...

  4. base64stego 还不懂base64的隐写,详解15行代码带你领略

    网上写了好多关于xctf MISC新手篇的base64Stego隐写的教程,但大都不太清楚,基本上都是讲了一段隐写原理,直接上代码了.但是代码是这道题的关键,代码讲了如何解码这个隐写的完整流程,这次我 ...

  5. ctf中关于图片的隐写随笔(不全)

    ①JPG图片的结束符,十六进制常为FFD9 ②binwalk的原理是:检查常见的文件头信息,如果不符合,一定有隐藏信息.③JPG是有损压缩,PNG是无损压缩,BMP是不压缩. 隐写的基本原理:图片查看 ...

  6. Bugku CTF练习题---杂项---隐写3

    Bugku CTF练习题---杂项---隐写3 flag:flag{He1l0_d4_ba1} 解题步骤: 1.观察题目,下载附件 2.打开图片,发现是一张大白,仔细观察一下总感觉少了点东西,这张图好 ...

  7. CTF杂项之音频隐写

    题目来自bugku 二话不说,直接上图 由题目可以看出,这题需要用到一个KEY,加上又是一段音频,很容易联想到一个著名的音频隐写解密软件Mp3stego 直接上工具 ok,成功Get Flag

  8. UNCTF杂项题Hidden secret 之NTFS交换数据流隐写

    ---恢复内容开始--- 做这道题目的经历比较坎坷,题目中用于隐藏flag的jpg文件出了问题,导致不能被交换数据流隐写所以出题人换了一次题目,最后做法也换了,不过出题人一开始的考察点还是基于NTFS ...

  9. F5隐写工具使用

      0x00 前言 今天在实验吧看到一个图片隐写的题目,用了stegslove和winHex分析一通发现并没有什么有效信息.看了评论区大佬的提示说用到了F5隐写工具,所以百度教程用了一下,发现确实解决 ...

随机推荐

  1. 用python开发调试器——起始篇

    首先,你得准备一套python开发环境,正常情况下,一般是在windows下开发的,因为win系统应用广泛,再则就是要有个IDE,这里我选择我熟悉的Eclipse.环境搭建,网上都有,比如:http: ...

  2. Java学习不走弯路教程(7.Eclipse环境搭建)

    7.Eclipse环境搭建 在前几章,我们熟悉了DOS环境下编译和运行Java程序,对于大规模的程序编写,开发工具是必不可少的.Java的开发工具比较常用的是Eclipse.在接下来的教程中,我们将基 ...

  3. SQL Server 远程更新目标表数据

    分享一个远程更新目标库数据的存储过程,适用于更新列名一致,主键为Int类型,可远程链接的数据库. ** 温馨提示:如需转载本文,请注明内容出处.** 本文连接:http://www.cnblogs.c ...

  4. 44.1khz 16位比特双声道一分钟的音乐文件占多少硬盘空间?

    2*2*44.1*1000*60=10584000字节=10M2个声道*(16比特/8比特)字节*采样率(每秒采样44.1*1000次)*一分钟有60秒16比特是精度,描述振幅的,16比特等于2个字节 ...

  5. jieba库分词

    (1)团队简介的词频统计 import jieba import collections s="制作一个购票小程序,这个购票小程序可以根据客户曾经的购票历史" s+="和 ...

  6. C语言 > 构造素数表

    #include <stdio.h> #define NUMBER 1000 int main(){ int isPrime[NUMBER]; ; i < NUMBER; i++){ ...

  7. 使用input file上传文件中onChange事件只触发一次问题

    每次上传文件的时候,都会将当前的文件路径保存至$event.target.value中,当第二次选择文件时,由于两次$event.target.value相同,所以不会触发change事件. 解决方案 ...

  8. Unity3D学习(一):简单梳理下Unity跨平台的机制原理

    前言 首先需要了解的是,Unity3D的C#基础脚本模块是通过Mono来实现的. 什么是Mono? 参考下百度百科:Mono是一个由Novell公司(由Xamarin发起)主持的项目,并由Miguel ...

  9. SSH整合配置文件概括

    配置方式一:struts.xml, applicationContext.xml(hibernate.cfg.xml配置信息写入spring配置文件中) (版本号, struts2:2.3.15; s ...

  10. c语言之单链表的创建及排序

    今天对之前学习过的链表知识进行简单的总结顺便写点代码:创建一个链表有头插法跟尾插法两种,在下面代码中我们为结点分配的内存实在堆上分配的,因此需要我们手动释放,释放用free()函数 下面代码贴出具体代 ...