misc24
修改 bmp 高度
010editor 打开
根据图片信息,文件头两部分共占 54 字节,真实图片数据大小为 675002 字节
而 bmp 文件每个像素由 3 个字节控制,对应 RGB 三原色
所以图片实际高度为 (675002 / 3 ) / 900 = 250
,十六进制表示为 FA
010editor 修改高度数据,另存为新图片,得到 flag
参考 bmp 文件结构
misc25
修改 png 高度 + crc 校验
010editor 打开图片
首先判断 crc 值是否正确,利用 crc 在线校验工具,截取 12 至 28 共 17 个字节的数据,输入得到 crc 计算结果
显然不匹配,一是宽高,二是 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
参考:https://blog.csdn.net/m0_58030673/article/details/128794368
misc26
同上
misc27
修改 jpg 高度为 FF,另存为新图片
参考 jpg 文件结构
misc28
修改 gif 高度为 FF,但有两处
第一个是全局高度,第二个是当前帧高度
参考 gif 文件结构
misc29
同上,但这个 gif 有很多帧,所以查找 96 00 替换为 FF 00,另存为新 gif
用 Photoshop 打开,找到有 flag 的一帧
misc30
同 misc24,但修改的是 bmp 宽度
根据图像尺寸计算,(427802 / 3) / 150 = 950
,修改宽度为 950,另存为新图片
misc31
同上,根据提示,需要修改 bmp 宽度
(487202 / 3) / 150 = 1082
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
修改原图片高度,同时修改对应的 crc 值,另存为新图片
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 两种
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 错误
使用脚本提取这些 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 错误
猜测正常为 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 打开
根据提示,统计 FF
的数量再减一,并转换成十六进制,统计前 32 个,得到 flag
misc49
统计这些 FFE
后的第四个字符,得到 flag
- Post link: http://example.com/2023/07/21/Misc%E5%85%A5%E9%97%A8-%E6%96%87%E4%BB%B6%E7%BB%93%E6%9E%84/
- Copyright Notice: All articles in this blog are licensed under unless otherwise stated.