第二十五题:
提示:flag在图片下面。
直接检查CRC,检测到错误,就直接暴力破解。
暴力破解CRC的python代码。
import binascii
import structdef brute_force_ihdr_crc(filename):
# 读取文件二进制数据
with open(filename, 'rb') as f:
data = f.read()
# 定位 IHDR 块的位置(跳过PNG签名和长度字段)
ihdr_start = 8 + 4 # 8字节签名 + 4字节长度字段
ihdr_type = data[ihdr_start:ihdr_start+4] # 应为 b'IHDR'
if ihdr_type != b'IHDR':
print("[-] IHDR chunk not found!")
return
# 提取原始宽高和其他参数(假设宽度和高度各占4字节)
width_bytes = data[ihdr_start+4 : ihdr_start+8] # 篡改后的宽度
height_bytes = data[ihdr_start+8 : ihdr_start+12] # 篡改后的高度
other_params = data[ihdr_start+12 : ihdr_start+17] # 后续5字节参数
# 提取存储的 CRC 值(位于IHDR数据块末尾)
stored_crc_bytes = data[ihdr_start+17 : ihdr_start+21]
stored_crc = struct.unpack('>I', stored_crc_bytes)[0] # 大端解析print(f"[*] 目标 CRC: {hex(stored_crc)}")
print(f"[* 原始篡改尺寸: 宽度={struct.unpack('>I', width_bytes)[0]}, 高度={struct.unpack('>I', height_bytes)[0]}")# 遍历可能的宽高范围(根据实际情况调整范围)
max_width = 2000 # 假设宽度最大可能到2000像素
max_height = 2000 # 假设高度最大可能到2000像素
print(f"[*] 开始暴力破解宽高范围: 1-{max_width} x 1-{max_height}...")for width in range(1, max_width + 1):
for height in range(1, max_height + 1):
# 构造 IHDR 数据块(类型码 + 宽高 + 其他参数)
ihdr_data = b'IHDR' + struct.pack('>I', width) + struct.pack('>I', height) + other_params
# 计算 CRC
computed_crc = binascii.crc32(ihdr_data) & 0xFFFFFFFF
if computed_crc == stored_crc:
print(f"\n[+] 成功匹配!真实宽高: {width}x{height}")
print(f" CRC: {hex(computed_crc)}")
return
print("[-] 未找到匹配的宽高组合,请扩大范围或检查参数!")if __name__ == '__main__':
brute_force_ihdr_crc('misc26.png') # 替换为你的文件名
ctfshow{494f611cc5842dd597f460874ce38f57}
第二十六题:
加上高度“ 25e ”得到ctfshow{94aef125e087a7ccf2e28e742efd704c}
第二十七题:
修改高度
ctfshow{5cc4f19eb01705b99bf41492430a1a14}
第二十八题:
修改高度后使用Stegsolve查看
ctfshow{59c8bc525426166b1c893fe12a387fd7}
第二十九题:
ctfshow{03ce5be6d60a4b3c7465ab9410801440}
第三十题:
提升说正确的宽度是950,我们在010里修改一下就可以得到flag了。
ctfshow{6db8536da312f6aeb42da2f45b5f213c}
第三十一题:
使用010打开复制FF
到3A
结束 所有字节是487253
减去文件头53
个字节后再除3(RGB
每个像素由3
个字节),最后再除150(高度)得到1082.6666666666667,即宽带为1082。
ctfshow{fb09dcc9005fe3feeefb73646b55efd5}
第三十二题:
ctfshow{685082227bcf70d17d1b39a5c1195aa9}
第三十三题:
ctfshow{03070a10ec3a3282ba1e352f4e07b0a9}
第三十四题:
这是python的脚本 用来修改宽度,每修改一个就保存一个,在出来的结果中使用肉眼找到正确的图片
这种方法只能在win系统下使用,利用windows忽略crc检验码的特性来完成题目,kali系统下我目前找不到平替的方法。
import zlib
import struct
filename = "misc34.png"
with open(filename, 'rb') as f:
all_b = f.read()
#w = all_b[16:20]
#h = all_b[20:24]
for i in range(901,1200):
name = str(i) + ".png"
f1 = open(name,"wb")
im = all_b[:16]+struct.pack('>i',i)+all_b[20:]
f1.write(im)
f1.close()
ctfshow{03e102077e3e5de9dd9c04aba16ef014}
第三十五题:
与三十四题一样,只能在win系统下使用,kali暂无平替方法。
import os
import binascii
import struct
bp = open("misc35.jpg", "rb").read()
for i in range(901,1500):
#根据题目给的图片格式修改后缀
image_name='test/misc35/'+str(i)+'.jpg'
image=open(image_name,"wb")
#png
#data=bp[:16] + struct.pack('>i', i)+bp[20:24]+bp[24:]#png
#jpg
data=bp[:157]+bp[157:159] + struct.pack('>h', i)+bp[161:] #jpg
image.write(data)
image.close()
ctfshow{ca35201ca9ed607e5a68f44ef573fbc3}
第三十六题:
与三十四题一样,只能在win系统下使用,kali暂无平替方法。
import os
import binascii
import struct
bp = open("misc36.gif", "rb").read()
#for i in range(901,1500):
for i in range(920,951):
#根据题目给的图片格式修改后缀
image_name='test/misc36/'+str(i)+'.jpg'
image=open(image_name,"wb")
#png
#data=bp[:16] + struct.pack('>i', i)+bp[20:24]+bp[24:]#png
#jpg
#data=bp[:157]+bp[157:159] + struct.pack('>h', i)+bp[161:] #jpg
#gif
data=bp[:38]+ struct.pack('>h', i)[::-1]+bp[40:42] +bp[42:]#gif
image.write(data)
image.close()
ctfshow{1ebf739f832906d60f57436b8179166f}
第三十七题:
第8、13、20、30、33个图都有部分flag,需要一个一个提取。
ctfshow{2056782cd57b13261dcbbe3d6eecda17}