[CTF隐写]png中CRC检验错误的分析
[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检验错误的分析的更多相关文章
- 记一道CTF隐写题解答过程
0x00 前言 由于我是这几天才开始接触隐写这种东西,所以作为新手我想记录一下刚刚所学.这道CTF所需的知识点包括了图片的内容隐藏,mp3隐写,base64解密,当铺解密,可能用到的工具包括bin ...
- CTF隐写——越光宝盒
0x题目 原题来自于实验吧:http://www.shiyanbar.com/ctf/1992 一句话,和一个PNG图片. 0x解题 1.下载图片以后,发现打不开. 首先想到的就是文件头可能被修改了, ...
- 南邮CTF隐写之丘比龙的女神
刚开始下载下图片来 习惯性的binwalk一下 没发现东西 formost一下也没分离出来 扔进c32asm中发现有nvshen.jpg 于是改后缀名字为.zip 解压nvshen.jpg发现无法解压 ...
- base64stego 还不懂base64的隐写,详解15行代码带你领略
网上写了好多关于xctf MISC新手篇的base64Stego隐写的教程,但大都不太清楚,基本上都是讲了一段隐写原理,直接上代码了.但是代码是这道题的关键,代码讲了如何解码这个隐写的完整流程,这次我 ...
- ctf中关于图片的隐写随笔(不全)
①JPG图片的结束符,十六进制常为FFD9 ②binwalk的原理是:检查常见的文件头信息,如果不符合,一定有隐藏信息.③JPG是有损压缩,PNG是无损压缩,BMP是不压缩. 隐写的基本原理:图片查看 ...
- Bugku CTF练习题---杂项---隐写3
Bugku CTF练习题---杂项---隐写3 flag:flag{He1l0_d4_ba1} 解题步骤: 1.观察题目,下载附件 2.打开图片,发现是一张大白,仔细观察一下总感觉少了点东西,这张图好 ...
- CTF杂项之音频隐写
题目来自bugku 二话不说,直接上图 由题目可以看出,这题需要用到一个KEY,加上又是一段音频,很容易联想到一个著名的音频隐写解密软件Mp3stego 直接上工具 ok,成功Get Flag
- UNCTF杂项题Hidden secret 之NTFS交换数据流隐写
---恢复内容开始--- 做这道题目的经历比较坎坷,题目中用于隐藏flag的jpg文件出了问题,导致不能被交换数据流隐写所以出题人换了一次题目,最后做法也换了,不过出题人一开始的考察点还是基于NTFS ...
- F5隐写工具使用
0x00 前言 今天在实验吧看到一个图片隐写的题目,用了stegslove和winHex分析一通发现并没有什么有效信息.看了评论区大佬的提示说用到了F5隐写工具,所以百度教程用了一下,发现确实解决 ...
随机推荐
- 用python开发调试器——起始篇
首先,你得准备一套python开发环境,正常情况下,一般是在windows下开发的,因为win系统应用广泛,再则就是要有个IDE,这里我选择我熟悉的Eclipse.环境搭建,网上都有,比如:http: ...
- Java学习不走弯路教程(7.Eclipse环境搭建)
7.Eclipse环境搭建 在前几章,我们熟悉了DOS环境下编译和运行Java程序,对于大规模的程序编写,开发工具是必不可少的.Java的开发工具比较常用的是Eclipse.在接下来的教程中,我们将基 ...
- SQL Server 远程更新目标表数据
分享一个远程更新目标库数据的存储过程,适用于更新列名一致,主键为Int类型,可远程链接的数据库. ** 温馨提示:如需转载本文,请注明内容出处.** 本文连接:http://www.cnblogs.c ...
- 44.1khz 16位比特双声道一分钟的音乐文件占多少硬盘空间?
2*2*44.1*1000*60=10584000字节=10M2个声道*(16比特/8比特)字节*采样率(每秒采样44.1*1000次)*一分钟有60秒16比特是精度,描述振幅的,16比特等于2个字节 ...
- jieba库分词
(1)团队简介的词频统计 import jieba import collections s="制作一个购票小程序,这个购票小程序可以根据客户曾经的购票历史" s+="和 ...
- C语言 > 构造素数表
#include <stdio.h> #define NUMBER 1000 int main(){ int isPrime[NUMBER]; ; i < NUMBER; i++){ ...
- 使用input file上传文件中onChange事件只触发一次问题
每次上传文件的时候,都会将当前的文件路径保存至$event.target.value中,当第二次选择文件时,由于两次$event.target.value相同,所以不会触发change事件. 解决方案 ...
- Unity3D学习(一):简单梳理下Unity跨平台的机制原理
前言 首先需要了解的是,Unity3D的C#基础脚本模块是通过Mono来实现的. 什么是Mono? 参考下百度百科:Mono是一个由Novell公司(由Xamarin发起)主持的项目,并由Miguel ...
- SSH整合配置文件概括
配置方式一:struts.xml, applicationContext.xml(hibernate.cfg.xml配置信息写入spring配置文件中) (版本号, struts2:2.3.15; s ...
- c语言之单链表的创建及排序
今天对之前学习过的链表知识进行简单的总结顺便写点代码:创建一个链表有头插法跟尾插法两种,在下面代码中我们为结点分配的内存实在堆上分配的,因此需要我们手动释放,释放用free()函数 下面代码贴出具体代 ...