ctfshow学习记录-misc入门(图片篇-文件结构34-40&42-44)


misc34

提示:出题人狗急跳墙,把IHDR块的CRC也改了,但我们知道正确宽度肯定大于900
解答:可以写脚本,修改宽度,每修改一个就保存一个,然后肉眼扫描找到flag。

import os
import binascii
import struct
bp = open("misc34.png", "rb").read()    
for i in range(901,1500):
    png_name='test/misc34/'+str(i)+'.png'#我是建立一个文件夹,可以不写前面的文件夹路径。
    png=open(png_name,"wb")
    data=bp[:16] + struct.pack('>i', i)+bp[20:24]+bp[24:]#这里可以直接写成bp[:16] + struct.pack('>i', i)+bp[20:],我是把高度单独写出来了。
    png.write(data)
    png.close()

可以看到1123宽度的为flag图片。
在这里插入图片描述
在这里插入图片描述
ctfshow{03e102077e3e5de9dd9c04aba16ef014}


misc35

提示:出题人负隅顽抗,但我们知道正确宽度肯定大于900
解答:jpg格式。
利用和上题类似的脚本(需要调整成适合jpg格式的数据),爆破出来的结果没有flag。之前的题大多是在高度上有调整,调整一下高度,确实有被裁减的部分,大概到600左右,可以看到模糊的flag项出来了,同时图片边界也显现出来。
在这里插入图片描述
对调整高度后的图片再利用脚本爆破。

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

993宽度开始,有一部分就出现了正确的flag。

在这里插入图片描述
ctfshow{ca35201ca9ed607e5a68f44ef573fbc3}


misc36

提示:出题人坦白从宽,正确的宽度在920-950之间
解答:gif格式,给了一定的宽度范围。同样先调整一个高度,这次调整到300即可。

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

宽度941出现flag。
在这里插入图片描述
ctfshow{1ebf739f832906d60f57436b8179166f}


misc37

提示:flag在图片里
解答:gif图片,用gif分离器分离一下。
第8、13、20、30、33个图都有部分flag,需要一个一个提取。
ctfshow{2056782cd57b13261dcbbe3d6eecda17}


misc38

提示:flag在图片里
解答:png图片。apng,类似gif一样的动图,用honeyview打开。
在这里插入图片描述
9、17、36、40有部分flag,逐一提取。
ctfshow{48b722b570c603ef58cc0b83bbf7680d}


misc39

提示:flag就像水,忽快忽慢地流
解答
没有遇到过的题型,看了一下wp,是需要取帧,利用不同帧之间的间隔时间来隐写的。
按照这个逻辑再去看题目,忽快忽慢体现就是一个时间,再结合给的gif动图,可以推测是利用不同帧之间的间隔时间来隐写。

用命令identify,可以在ubuntu或kali使用该命令。

安装:
sudo apt-get install imagemagick
提取:
identify -format "%T " misc39.gif > 1.txt

   -format "string"    #输出图像指定特性

在这里插入图片描述
内容全部都是36和37,只有两个数据,可能是二进制,那么替换一下,36转0,37转1。

#二进制替换&二进制to char
from os import replace
f="""37 37 36 36 36 37 37 37 37 37 36 37 36 36 37 37 36 36 37 37 36 37 37 37 36 36 37 37 37 37 36 37 36 36 36 37 37 36 37 37 37 37 37 37 37 36 37 37 37 37 37 37 37 36 37 37 36 37 37 36 37 36 37 36 37 37 36 36 37 36 36 37 37 37 36 36 36 36 37 37 36 36 36 37 36 37 37 36 36 37 36 37 37 36 36 37 37 36 37 37 36 36 37 37 36 36 37 37 37 36 36 37 36 37 37 37 36 36 37 36 37 37 36 37 36 37 37 37 36 36 37 37 36 37 37 36 36 36 37 36 36 37 37 36 37 37 37 37 37 36 36 36 37 36 37 37 36 36 37 36 37 36 37 37 36 36 37 36 36 37 37 36 37 37 36 36 37 37 37 36 36 36 37 37 36 36 37 36 36 36 37 37 37 36 36 37 36 37 37 36 37 37 36 36 37 37 36 36 37 37 37 37 36 36 36 36 37 36 37 37 37 36 36 37 37 37 36 36 37 36 37 37 37 36 36 36 37 36 37 37 36 36 36 37 37 37 37 36 36 36 36 37 36 37 37 36 36 36 36 36 37 37 36 37 36 36 36 37 37 36 37 36 37 36 37 37 37 36 36 37 37 37 37 37 37 36 37"""
f=f.replace("36","0").replace("37","1")
a=f.split(' ')
flag=''
num=7
zu=len(a)//num

for i in range(zu):
    b=a[i*num:i*num+num]
    c=int("".join(str(j) for j in b),2)
    print(c,end=",")
    flag+=chr(c)
print(flag) 
#{52812ff995fb7be268d963a9ebca0459}

misc40

提示:flag就像歌,有长有短仿佛岁月悠悠
解答:都有gif分离器了,怎么能没有apng分离器。
APNG Disassembler
在这里插入图片描述
处理完后,每一帧图片都会带有一个 txt 文件。
在这里插入图片描述
分离出来的图片没有任何flag信息。那么可能就是txt文件中的信息,比如1中229,在后面的信息中极有可能存在flag,提取一下。

flag=""
for i in range(1,69): 
    if(i<10):
        f = open('D:/Downloads/misc40/apngframe0'+str(i)+'.txt')
    else:
        f = open('D:/Downloads/misc40/apngframe'+str(i)+'.txt')
    s = f.read()
    flag += chr(int(s.split("/")[0][6:]))
print(flag)
#前面一堆乱码迷惑数据,后面是flag:ctfshow{95ca0297dff0f6b1bdaca394a6fcb95b}

misc42

提示:flag有多长?2cm……不好意思打错了,41位
解答:用tweakpng打开,可以看到idat的长度是flag。
在这里插入图片描述

ascii转一下chr。

a="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"
c=a.split(',')
flag=""
for i in range(0,len(c)):
    flag+=chr(int(c[i]))
    print(flag)
print(flag)
#ctfshow{078cbd0f9c8d3f2158e70529f8913c65}

misc43

提示:错误中隐藏着通往正确答案的道路
解答:png图片,用tweakpng打开,出现很多CRC错误的报错。
在这里插入图片描述
根据提示我们需要提取错误的CRC
工具一
PCRT:一款自动化检测修复PNG损坏的取证工具。但是这个工具是python2,没有python3的。

#安装:
git clone https://github.com/sherlly/PCRT.git

python PCRT.py -y -v -i misc43.png > 43.txt

在这里插入图片描述
提取错误crc,转成str。
在这里插入图片描述
ctfshow{6eb2589ffff5e390fe6b87504dbc0892}

工具二
PNG Debugger:可读取 PNG 图片的数据,检测每个数据块中的 CRC 是否正确。
下载地址

下载后,建一个cmd的快捷方式,属性的起始位置设置为PNGDebugger.exe存放的路径。
在这里插入图片描述
点击该快捷方式,执行指令。不重定向的话,结果会直接出现在终端。
在这里插入图片描述
为了方便查看,这里我输出到txt中。
在这里插入图片描述
PNGDebugger png图片路径 >输出位置(pngdebugger小写也可以)

然后之后就和上面一样了。


misc44

提示:错误中还隐藏着坑
解答:这里使用方法二。
在这里插入图片描述
错误数据较多,且如misc43转换后并未有任何flag信息。那么再看一下信息,正确的和错误的都很多,那么是否涉及二进制01转换。测试一下。

先对txt文件删减一下,只保留其中的IDAT部分。开头删一下,结尾删一下。
在这里插入图片描述
然后脚本跑一下,获取flag。

f=open("D:/Downloads/misc44/44.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="")
#ctfshow{cc1af32bf96308fc1263231be783f69e}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值