您当前的位置: 首页 > 

九枕

暂无认证

  • 3浏览

    0关注

    42博文

    0收益

  • 0浏览

    0点赞

    0打赏

    0留言

私信
关注
热门博文

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

九枕 发布时间:2022-07-11 10:00:00 ,浏览量:3

目录
    • misc34
    • misc35
    • misc36
    • misc37
    • misc38
    • misc39
    • misc40
    • misc42
    • misc43
    • misc44

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 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}
关注
打赏
1662624000
查看更多评论
立即登录/注册

微信扫码登录

0.0422s