[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 文件头crc错误_[CTF隐写]png中CRC检验错误的分析相关推荐

  1. 信息隐写--1998年出版高被引论文--on the limits of steganography隐写技术的局限性

    这篇文章中出现最多的就是"囚犯问题"这个例子,在阅读论文中,结合这个例子及其变形来理解,可以更容易理解作者想要表达的意思.全文没有一张图,一共8页...看了好几天才看完 intro ...

  2. 7z解压crc错误_百度网盘压缩下载文件的CRC校验错误的解决方法

    转载自:http://blog.sina.com.cn/s/blog_610787990102xcnv.html 百度网盘压缩下载文件的CRC校验错误的解决方法 从百度网盘用打包压缩方式下载的文件在解 ...

  3. CTF练题(5)word隐写基础题,jpg图片隐写,敲击码解密

    2022.11.2    两道misc题目. 题目一    word隐写基础 题目信息如下: 以及一个无法打开的word文档: 解题步骤: (1)将该word文档拖入010Editor中进行分析,发现 ...

  4. java文件头工具类_判断文件类型工具类

    package com.huawei.fileExerise; import java.io.FileInputStream; import java.io.IOException; import j ...

  5. oracle12c报crc错误,【已解决】系统提示CRC错误,该怎么办?

    吴川   2019-7-11 华南区技术负责人 概要 不少用户可能都会遇到系统提示CRC错误的问题,比如提示"驱动器无法访问:数据错误(循环冗余校验)",这是哪些原因导致的呢?本文 ...

  6. python图像隐写技术_图像隐写技术(Image Steganography)

    withopen( "input.jpg", "rb") asf: f_bytes = f.read print( f_bytes[: 2] ) print( ...

  7. modbus协议crc校验c语言代码,MODBUS通信协议中CRC校验码的计算(C/C++)实现

    错误检测的方法 错误校验(CRC)域占用两个字节,包含了一个16位的二进制值.CRC值由传输设备计算出来,然后附加到数据帧上,接收设备在接收数据时重新计算CRC值,然后与接收到的CRC域中的值进行比较 ...

  8. 3gpp文件头文件解析_居于LLVM 的命令行参数解析

    在写命令行程序的时候经常需要解析各种命令行参数.打印help信息等,觉得非常的麻烦.今天介绍一种超级棒的命令参数解析的方法:居于LLVM 的命令行参数解析,有了它妈妈再也不用担心我不会解析命令行参数^ ...

  9. python库文档的错误_自己编程中遇到的Python错误和解决方法汇总整理

    开个贴,用于记录平时经常碰到的Python的错误同时对导致错误的原因进行分析,并持续更新,方便以后查询,学习. 知识在于积累嘛!微笑 +++++++++++++++++++++++++++++++++ ...

最新文章

  1. 深入理解 Event Loop
  2. 1个多月就能看到效果的减肥大法 - 生活至上,美容至尚!
  3. 快速保留小数点后面几位(转)
  4. 全局变量局部变量ScriptCase中的全局变量、局部变量
  5. 第七章:在Spark集群上使用文件中的数据加载成为graph并进行操作(3)
  6. java 数据库 下载_数据库下载
  7. 【TDA4系列】芯片资源:处理器Processor Subsystems 与 加速器和协处理器Accelerators and Coprocessors
  8. 台式机安装黑苹果-新手教程
  9. DOSBox下载安装
  10. cisco模拟器无线路由器
  11. c语言线性链表的插入,线性链表的创建_插入_删除_操作_C语言
  12. liunx是相关总结
  13. 用html制作四行四列的表格,HTML表格元素
  14. 算法的衡量:时间复杂度和空间复杂度
  15. 《Miss Talk》第07期:对话拓课云联合创始人兼CTO 王晓伟
  16. nginx报错问题记录
  17. Java(二十二) -- 生产者消费者模式
  18. 带宽,线速以及吞吐量的概念
  19. ORB-SLAM2系列第三章—— 地图初始化
  20. 烤仔DeFi课堂 | 从雅典到去中心化金融

热门文章

  1. 重磅!2022QS世界大学排名公布!
  2. 北大图灵班本科生吴克文获STOC 2020最佳论文奖
  3. 19岁就在南大读博的“00后”女生:这是我的学习经历
  4. 【分享】博士生提高科研幸福感的途径
  5. Javascrapy的window onload()函数用法
  6. 基于OpencvCV的情绪检测
  7. 简单粗暴的多对象目标跟踪神器 – DeepSort
  8. 你还在为了进高校做教师而读博吗?
  9. 接口的特点及,抽象类与接口的区别
  10. Ubuntu 18.04缺少libgconf-2.so.4