前言:在做很多题的时候,发现有些题都能拿到flag,但是具体怎么出的,只知道是那么回事,但是具体要我说什么原理,对不起我不知道,“事是这么个事,但不是这个个理”,最近在做题和八神交流的时候,他说到如果不知道原理,只知道追求拿到flag的话,可以不做,相对来说我掌握的知识都比较片面,希望今后能尽量补补吧,能补就补,今天做到了misc入门的几道题,搜集了相关的资料(每次做这方面的题的时候都会百度,这次就搜集起来希望能自己能好好看看)希望看到的师傅发现有啥错误能指正,我真的很菜很菜的!!

首先一个就是:

图片格式的crc校验

png格式的图片,文件头是89 50 4e 47 0d 0a 1a 0a 00 00 00 0d
1.png

第二行前四位是宽,接下来四位是高,0806是下边这个。后边的C1 D0 B3 D4 就是校验码。校验的范围从494844到000000
2.png

仔细讲一下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.把图片拖进010editor中会发现左下角提示CRC不匹配,这是因为修改了高宽,却没有修改CRC,导致读取报错。

2.在linux中CRC32错误的图片是无法打开的,也可以利用pngcheck检查图片,会提示CRC32校验错误

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

import binascii
import struct
crc32key = 0xC1D0B3E4
for i in range(0, 65535):
  height = struct.pack('>i', i)
  data = b'\x49\x48\x44\x52\x00\x00\x0C\xC0'+height+ b'\x08\x06\x00\x00\x00'
 
  crc32result = binascii.crc32(data) & 0xffffffff
  if crc32result == crc32key:
    print ''.join(map(lambda c: "%02X" % ord(c), height))

修改宽度同理,只需将参数进行简单替换
也可以同时爆破出图片的宽高:

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))

python3爆破宽高:

import zlib
import struct

# 同时爆破宽度和高度
filename = "misc34.png"
with open(filename, 'rb') as f:
    all_b = f.read()
    data = bytearray(all_b[12:29])
    n = 4095
    for w in range(n):
        width = bytearray(struct.pack('>i', w))
        for h in range(n):
            height = bytearray(struct.pack('>i', h))
            for x in range(4):
                data[x+4] = width[x]
                data[x+8] = height[x]
            crc32result = zlib.crc32(data)
            #替换成图片的crc
            if crc32result == 0x09DAD161:
                print("宽为:", end = '')
                print(width, end = ' ')
                print(int.from_bytes(width, byteorder='big'))
                print("高为:", end = '')
                print(height, end = ' ')
                print(int.from_bytes(height, byteorder='big'))













标签: none

暂无评论