通过CRC32爆破修改图片的宽高 ctf-misc图片隐写

**

一.在处理图片隐写题的时候,可能会修改图片原有的宽高,导致图片里面的内容无法正常显示,那么怎么判断它的宽高是否被修改了呢?

**
1.把图片拖进010editor中会发现左下角提示CRC不匹配,这是因为修改了高宽,却没有修改CRC,导致读取报错。
通过CRC32爆破修改图片的宽高 ctf-misc图片隐写_第1张图片
2.在linux中CRC32错误的图片是无法打开的,也可以利用pngcheck检查图片,会提示CRC32校验错误

在这里插入图片描述
**

二.既然知道了CRC校验码错误,那么如何修改呢? 首先我们要知道CRC32是有哪些字节构成的

**
PNG文件中总是以固定的八个字节开头

89 50 4E 47  0D 0A 1A 0A

数据块长度13

00 00 00 0D

文件头数据块标示IDCH

49 48 44 52

13位数据块(IHDR)
下面为宽和高

00 00 07 7E  00 00 03 60

这5个字节依次为Bit depth,ColorType,Compression method,Filter method,Interlace method

08 06 00 00 00

接下来的四字节为该png图片的CRC校验码

7D C7 3F 7F

CRC校验码,由IDCH和IHDR共十七位字节进行crc计算得到
在这里插入图片描述

解决方法:

1.简单点的隐写题,可以直接修改宽高,然后显示flag
2.那么如果修改宽高,并不会直接看到flag,需要放入stegsolve里或者做其它的进一步处理时。
这里会产生一个问题,那就是修改过宽高的图片stegsolve无法打开,提示IO错误。
这是因为png图像的IHDR段中的高宽被修改,导致计算出来的CRC不正确,所以无法正确读取。
通过python2脚本来获取图片高度

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

运行:得到图片实际高度为0000043C,在010editor中修改保存
在这里插入图片描述
修改宽度同理,只需将参数进行简单替换
3.也可以同时爆破出图片的宽高,K.R.师傅告诉我的脚本:

import struct
import zlib

def hexStr2bytes(s):
    b = b""
    for i in range(0,len(s),2):
        temp = s[i:i+2]
        b +=struct.pack("B",int(temp,16))
    return b

str1="49484452"
str2="0806000000"
bytes1=hexStr2bytes(str1)
bytes2=hexStr2bytes(str2)
wid,hei = 1918,864

crc32 = "0x7dc73f7f"

for w in range(wid,wid+2000):
    for h in range(hei,hei+2000):
        width = hex(w)[2:].rjust(8,'0')
        height = hex(h)[2:].rjust(8,'0')
        bytes_temp=hexStr2bytes(width+height)
        if eval(hex(zlib.crc32(bytes1+bytes_temp+bytes2))) == eval(crc32):
            print(hex(w),hex(h))

爆破结果:
在这里插入图片描述

你可能感兴趣的:(ctf-misc,python,linux)