misc24

修改 bmp 高度

010editor 打开

image-20230720211343128

根据图片信息,文件头两部分共占 54 字节,真实图片数据大小为 675002 字节

而 bmp 文件每个像素由 3 个字节控制,对应 RGB 三原色

所以图片实际高度为 (675002 / 3 ) / 900 = 250,十六进制表示为 FA

010editor 修改高度数据,另存为新图片,得到 flag

image-20230720212329144

参考 bmp 文件结构

misc25

修改 png 高度 + crc 校验

010editor 打开图片

image-20230720213710072

首先判断 crc 值是否正确,利用 crc 在线校验工具,截取 12 至 28 共 17 个字节的数据,输入得到 crc 计算结果

image-20230720213845751

显然不匹配,一是宽高,二是 crc 值,二者之一被人为修改

使用脚本进行暴力破解,得到 crc 值对应的宽度和高度

import binascii
import struct
 
file = open("...", "rb").read()    #打开图片
crcDec = int(file[29:33].hex(),16)     #读取图片中的CRC校验值
print(crcDec)
 
for i in range(4000):                        #宽度1-4000进行枚举
    for j in range(4000):                    #高度1-4000进行枚举
        data = file[12:16] + \
            struct.pack('>i', i)+struct.pack('>i', j)+file[24:29]
        crc32 = binascii.crc32(data) & 0xffffffff
        if(crc32 == crcDec):            #计算当图片大小为i:j时的CRC校验值,与图片中的CRC比较,当相同,则图片大小已经确定
            print(i, j)
            print('hex:', hex(i), hex(j))
1995185728
900 250
hex: 0x384 0xfa

修改高度为 FA,或者右边修改为 250,另存为新图片,得到 flag

image-20230720215054678

参考:https://blog.csdn.net/m0_58030673/article/details/128794368

misc26

同上

misc27

修改 jpg 高度为 FF,另存为新图片

image-20230723210615336

参考 jpg 文件结构

misc28

修改 gif 高度为 FF,但有两处

第一个是全局高度,第二个是当前帧高度

image-20230723211704964

参考 gif 文件结构

misc29

同上,但这个 gif 有很多帧,所以查找 96 00 替换为 FF 00,另存为新 gif

用 Photoshop 打开,找到有 flag 的一帧

image-20230723212312024

misc30

同 misc24,但修改的是 bmp 宽度

image-20230723213126984

根据图像尺寸计算,(427802 / 3) / 150 = 950,修改宽度为 950,另存为新图片

misc31

同上,根据提示,需要修改 bmp 宽度

(487202 / 3) / 150 = 1082

image-20230801200629226

misc32

png + crc

截取 12 - 28 字节的数据,利用在线工具计算 crc 值,不匹配

使用脚本对图片中的 crc 值进行暴力破解

misc33

同上,脚本暴力破解

misc34

png + crc

与之前不同的是,宽高和 crc 值都被改了

修改脚本,根据提示从 900 宽度开始遍历

import struct
 
filename = "..."
with open(filename, 'rb') as f:
    data = f.read()
    for i in range(901,1200):
        name = str(i) + ".png"
        f1 = open(name,"wb")
        new = data[:16]+struct.pack('>i',i)+data[20:]
        f1.write(new)

在生成的图片中找到正确高度为 1123

image-20230801201959718

修改原图片高度,同时修改对应的 crc 值,另存为新图片

image-20230801202357997

misc35

本题实际上 jpg 宽度和高度都要修改

提示宽度大于 900,先修改高度到 1000 方便查看

使用脚本遍历宽度,生成图片

import struct
filename = "..."
with open(filename, 'rb') as f:
    data = f.read()
    for i in range(901,1000):
        name = str(i) + ".jpg"
        f1 = open(name,"wb")
        new = data[:159]+struct.pack('>h',i)+data[161:]
        f1.write(new)
        f1.close()

misc36

同上,gif 宽度和高度都要修改

先修改高度到 500 方便查看,注意全局高度和帧高度都要修改

使用脚本遍历宽度,生成图片

import struct
filename = "..."
with open(filename, 'rb') as f:
    data = f.read()
    for i in range(920,951):
        name = str(i) + ".gif"
        f1 = open(name,"wb")
        new = data[:38]+struct.pack('>h',i)[::-1]+data[40:]
        f1.write(new)
        f1.close()

misc37

gif 动图,用 Photoshop 打开逐帧查看

misc38

png 动图,用 honeyview 打开逐帧查看

misc39

gif 帧间隔隐写

用 Photoshop 里的 时间轴 查看,每帧间隔有 0.37s 和 0.36s 两种

image-20230808143219085

0.37 视为 1,0.36 视为 0,进行转换

使用 kali 中的 ImageMagick 工具进行提取

identify -format "%T" misc39.gif > 39.txt

得到

3737363636373737373736373636373736363737363737373636373737373637363636373736373737373737373637373737373737363737363737363736373637373636373636373737363636363737363636373637373636373637373636373736373736363737363637373736363736373737363637363737363736373737363637373637373636363736363737363737373737363636373637373636373637363737363637363637373637373636373737363636373736363736363637373736363736373736373736363737363637373737363636363736373737363637373736363736373737363636373637373636363737373736363636373637373636363636373736373636363737363736373637373736363737373737373637

再使用脚本进行转换

s = "..."
for i in range(287):
    if(s[2*i: 2*i+2] == "37"):
        print("1", end = "")
    else:
        print("0", end = "")

得到

11000111110100110011011100111101000110111111101111111011011010101100100111000011000101100101100110110011001110010111001011010111001101100010011011111000101100101011001001101100111000110010001110010110110011001111000010111001110010111000101100011110000101100000110100011010101110011111101

观察其长度为 287,正好是 7 的倍数

可以猜想每 7 位为一组,得到 flag

s = "..."
flag = ""
for i in range(41):
    flag+=chr(int(s[7*i:7*(i+1)],2))
print(flag)

misc40

png 帧间隔隐写

使用 APNG Disassembler 工具进行分离,得到一组 png 图片和对应 txt 文本

txt 内容如下

delay=229/1000

使用脚本进行转换

flag = ""
for i in range(1,69):
    f = open("apngframe" + str(i).zfill(2) + ".txt")
    s = f.read()
    flag += chr(int(s.split("/")[0][6:]))
print(flag)

zfill() 是在 字符串形式的数字 前自动补0的函数,如 01 02 03 等

misc42

png 帧数据长度隐写

使用脚本进行转换,得到 flag

f = open("...",'rb')
s = f.read(1)
result = ""
# 将图片数据转换为十六进制字符串
while s:
    byte = ord(s)
    result += '%02x'%(byte)
    s = f.read(1)

# 提取其中的长度数据,并转换为flag
start = 66
lenStr = result[start:start+8]
len = int(lenStr,16)
while True:
    print(chr(len),end="")
    if chr(len) == "}" :
        break
    start = start + 8 + 8 + len*2 + 8
    lenStr = result[start:start+8]
    len = int(lenStr,16)

misc43

010 editor 打开,提示 crc 错误

image-20230808170044679

使用脚本提取这些 crc 值,转换为 flag

f = open("...",'rb')
s = f.read(1)
result = ""
while s:
    byte = ord(s)
    result += '%02x'%(byte)
    s = f.read(1)

lenStart = 66
lenStr = result[lenStart:lenStart+8]
lenInt = int(lenStr,16)
crcStart = lenStart + 8 + 8 + lenInt*2
crcStr = result[crcStart:crcStart+8]
str = ""
while True:
    lenStart = lenStart + 8 + 8 + lenInt*2 + 8
    lenStr = result[lenStart:lenStart+8]
    if lenStr == "":
        break
    lenInt = int(lenStr,16)
    crcStart = lenStart + 8 + 8 + lenInt*2
    crcStr = result[crcStart:crcStart+8]
    str += crcStr

for i in range(len(str) // 2):
    print(chr(int(str[2*i:2*(i+1)],16)),end="")

其实直接复制这些 crc 值更快

misc44

010 editor 打开仍然报的 crc 错误

image-20230808180140588

猜测正常为 1,报错为 0

将报错信息复制下来,使用脚本转换,得到 flag

f = open("1.txt")
s = f.read().split(" ")

result = ""
index  = 4

str = ""
for i in range(1,345):
    str += "1"

for index in range(4,len(s),9):
    n = int(s[index].split("]")[0][6:])
    print(n)
    str = str[:n-1] + "0" + str[n:]

print(str)

flag = ""
for i in range(len(str) // 8):
    flag += chr(int(str[8*i:8*(i+1)],2))

print(flag)

misc45

按提示转换文件格式,png 转为 bmp

再使用 binwalk 进行分离,得到含有 flag 的文件

misc48

010 editor 打开

image-20230817212910694

根据提示,统计 FF 的数量再减一,并转换成十六进制,统计前 32 个,得到 flag

misc49

image-20230817213428145

统计这些 FFE 后的第四个字符,得到 flag