【Misc】CTFSHOW 入门 wp
目录
图片篇(基础操作)
misc1
misc2
misc3
misc4
图片篇(信息附加)
misc5
misc6
misc7
misc8
misc9
misc10
misc11
misc12
misc13
misc14
misc15
misc16
misc17
misc18
misc19
misc20
misc21
misc22
misc23
misc41
图片篇(文件结构)
misc24
misc25
misc26
misc27
misc28
misc29
misc30
misc31
misc32
misc33
misc34
misc35
misc36
misc37
misc38
misc39
misc40
misc42
misc43
misc44
misc45
misc46
图片篇(颜色通道)
misc50
misc53
misc54
misc55
misc56
图片篇(基础操作)
misc1
点开就是flag
OCR识别一下
ctfshow{22f1fb91fc4169f1c9411ce632a0ed8d}
misc2
给了个png头的txt
改后缀为png拿到flag
misc3
给了个.bpg文件
用bpgview来打开
https://bellard.org/bpg/
misc4
给了6个txt
https://cn1nja.github.io/posts/misc%E5%B8%B8%E8%A7%81%E6%96%87%E4%BB%B6%E5%A4%B4/
PNG
jpeg
bmp
gif
tif
webp
改后缀后拼起来拿到flag
图片篇(信息附加)
misc5
直接打开没有flag
010打开,全局搜ctfshow找到flag
misc6
010打开,全局搜ctfshow
misc7
同上
misc8
foremost分离文件
misc9
misc10
misc11
用tweakpng.exe编辑
删除第一个png
在第二个png里拿到flag
misc12
一个一个删IDAT,直到出现flag
misc13
不难看出是把flag隔一个字符放一个
提一下就行
misc14
dd if=misc14.jpg of=result.jpg skip=2103 bs=1
misc15
misc16
misc17
zsteg -E "extradata:0" misc17.png > misc17
binwalk -e misc17
misc18
misc19
EXIF,全称为 Exchangeable Image File Format(可交换图像文件格式),是一种标准。
它的主要作用是为数码相机、扫描器和其他处理数码图像设备所生成的图像文件(如 JPEG、TIFF、RAW)嵌入元数据。
简单来说,EXIF 就是“关于图像信息的数据”,它被直接写入到图像文件内部。
https://exif.tuchong.com/
misc20
misc21
就是要取x和y的16进制
拼接起来拿到flag
ctfshow{e8a221498d5c073b4084eb51b1a1686d}
misc22
缩略图和点开后不一样
exiftool misc22.jpg
exiftool -ThumbnailImage -b misc22.jpg > flag.jpg
misc23
exiftool misc23.psd
转一下时间戳
https://tool.lu/timestamp/
四个都转一下,hex一下,拼在一起拿到flag
misc41
010里面全局搜F001
图片篇(文件结构)
misc24
图高为150=0x96
把96改为FF
misc25
附件是一个png,crc校验出了问题
爆一下宽高
import binascii
import struct# 读取文件
filename = "misc25.png"
crcbp = open(filename, "rb").read()# 提取CRC值(需要根据实际文件调整位置)
# 通常CRC在IHDR块的最后4个字节
crc32frombp = int(crcbp[29:33].hex(), 16) # 这个位置可能需要调整
print("原始CRC:", hex(crc32frombp))# 获取IHDR块类型和固定数据
chunk_type = b'IHDR'
fixed_data = crcbp[24:29] # 宽高之后的数据(位深、颜色类型等)print("开始爆破...")
for i in range(1, 4000):for j in range(1, 4000):# 构建数据:IHDR + 宽度 + 高度 + 固定数据data = chunk_type + struct.pack('>i', i) + struct.pack('>i', j) + fixed_datacrc32 = binascii.crc32(data) & 0xffffffffif crc32 == crc32frombp:print(f"爆破成功!宽度: {i}, 高度: {j}")print(f"十六进制: width={hex(i)}, height={hex(j)}")# 可选:修复文件repaired_data = crcbp[:16] + struct.pack('>i', i) + struct.pack('>i', j) + crcbp[24:]with open("fixed.png", "wb") as f:f.write(repaired_data)print("修复后的文件已保存为: fixed.png")exit(0)print("在1-4000范围内未找到正确的宽高")
misc26
一样的脚本
misc27
jpg没有crc校验,直接把高度改成FF
misc28
改高度为FF
misc29
是个GIF动图
把每一帧的高度都修改
9600 -> FF00
最后在动图中拿到flag
misc30
950 -> 03b6
附件给的是一个bmp
原图宽为900 -> 0384
把84改为b6即可
misc31
(487254-54)/(3*150)
misc32
附件给了个png
用上面的脚本爆破下宽高
misc33
同上
misc34
直接爆宽高有问题
根据题目提示爆宽就行,直到生成能显示的图片
import struct
bp = open("misc34.png", "rb").read()
for i in range(900,1200):#根据题目给的图片格式修改后缀image_name='misc34/'+str(i)+'.png'image=open(image_name,"wb")#pngdata=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:]#gifimage.write(data)image.close()
misc35
附件是jpg
还是用上面的脚本
爆出来都是一片空白,尝试把高度拉高
高度拉高到600之后,可以看到最下方的黑体字
再去爆宽度,拿到flag
misc36
附件是gif
先改一下高度,看到最下面的黑体字
然后爆宽
misc37
附件是一个gif
用stegsolve去看每一帧
一帧一帧看拿到flag
misc38
honeyview打开png
是个apng动图
逐帧看拿到flag
misc39
附件给了gif
identify -format "%T " misc39.gif > misc39.txt
将36看作0,37看作1
转出来共287个字符
11000111110100110011011100111101000110111111101111111011011010101100100111000011000101100101100110110011001110010111001011010111001101100010011011111000101100101011001001101100111000110010001110010110110011001111000010111001110010111000101100011110000101100000110100011010101110011111101
s = "11000111110100110011011100111101000110111111101111111011011010101100100111000011000101100101100110110011001110010111001011010111001101100010011011111000101100101011001001101100111000110010001110010110110011001111000010111001110010111000101100011110000101100000110100011010101110011111101"
flag = ""
for i in range(41): #287//7flag += chr(int(s[7*i:7*(i+1)], 2))
print(flag)
misc40
附件是个apng动图
用APNG Disassembler提一下
flag=""
for i in range(1,69):if(i<10):f = open('G:/misc/misc40/apngframe0'+str(i)+'.txt')else:f = open('G:/misc/misc40/apngframe'+str(i)+'.txt')s = f.read()flag += chr(int(s.split("/")[0][6:]))
print(flag)
misc42
用TweakPNG打开附件
将IDAT的Length转成chr
s = [229,152,191,229,152,191,49,99,116,102,115,104,111,119,123,48,55,56,99,98,100,48,102,57,99,56,100,51,102,50,49,53,56,101,55,48,53,50,57,102,56,57,49,51,99,54,53,125]
for i in s:print(chr(i),end='')
misc43
用png-debugger看到CRC错误
把crc-code拼起来
misc44
数据太多,直接导出来
PNGDebugger.exe misc44.png > misc44.txt
将ok替换为1,failed替换为0
f=open("misc44.txt","r").read()
flag=""
for i in f.split():if "OK!" == i:flag += "1"elif "FAILED" ==i:flag += "0"
print(flag)
for i in range(len(flag)//8):print(chr(int(flag[8*i:8*(i+1)],2)),end="")
misc45
将png转为bmp
https://convertio.co/zh/png-bmp/
misc46
gif一直在偏移
identify misc46.gif > misc46.txt
arr=[]
with open('misc46.txt','r') as file:for i in file.readlines():content_list=i.split(' ')arr.append(content_list[3][8:].replace('+',' '))
with open('misc46_point.txt','w') as result:for i in arr:result.write(i+'\n')
再用gnuplot画图
图片篇(颜色通道)
misc50
misc53
misc54
misc55
先把图片翻转成正常的
PK头,提取成压缩包