ctfshow 做题 MISC入门 模块 31-40

Posted Goodric

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了ctfshow 做题 MISC入门 模块 31-40相关的知识,希望对你有一定的参考价值。

ctfshow 做题 MISC入门 模块 31-40

——

misc31

题目描述: 高度是正确的,但正确的宽度是多少呢。
下载附件图片,现在是看不到内容的。

这里和 misc24 的原理一样,通过 bmp 图片像素计算图片的宽度。
还不会写脚本,直接算吧。

目前图片是 900*150=135000个像素大小。
每个像素点由3个字节(十六进制码6位)表示,每个字节负责控制一种颜色,分别为蓝(Blue)、绿(Green)、红(Red)

用 winhex 打开,看到共有 487253 个字节,文件头占 53个字节。
则正确的宽度应为 (487253-53) / 3 / 150 = 1082 (结果取整)

得到正确宽度后,用 010editor 打开,用 BMP.bt 模板修改图片宽度。

再打开图片,得到 flag 。
ctfshow{fb09dcc9005fe3feeefb73646b55efd5}

——
——

misc32

题目描述:高度是正确的,但正确的宽度是多少呢
下载附件为 png 格式的图片,要求正确的宽度。
从大佬的 wp 拿了 python 脚本,直接爆 png 图片的宽度和高度。

import zlib
import struct

#同时爆破宽度和高度
filename = "C:/Users/Goodric/Desktop/misc32.png"
with open(filename, 'rb') as f:
all_b = f.read()
data = bytearray(all_b[12:29])
n = 4095
for w in range(n):
width = bytearray(struct.pack('>i', w))
for h in range(n):
height = bytearray(struct.pack('>i', h))
for x in range(4):
data[x+4] = width[x]
data[x+8] = height[x]
crc32result = zlib.crc32(data)
#替换成图片的crc
if crc32result == 0xE14A4C0B:
print("宽为:", end = '')
print(width, end = ' ')
print(int.from_bytes(width, byteorder='big'))
print("高为:", end = '')
print(height, end = ' ')
print(int.from_bytes(height, byteorder='big'))

得到正确的宽度为 1044 ,转换为 16 进制为 414 。
用 010 editor 打开,把 00 00 03 84 改为 00 00 04 14
改完之后保存,打开图片,得到 flag 。
ctfshow{685082227bcf70d17d1b39a5c1195aa9}

——
——

misc33

题目描述: 出题人丧心病狂,把高度也改了
下载附件为 png 格式的图片。
还是用上面的脚本,修改crc32result == 0x5255A798
运行得到 高为 978 ,宽为142 。用 010editor 进行修改
重新打开图片,看到 flag 。
ctfshow{03070a10ec3a3282ba1e352f4e07b0a9}

——
——

misc34

题目描述: 出题人狗急跳墙,把IHDR块的CRC也改了,但我们知道正确宽度肯定大于900
又是一种新的题型,上面的题目就是根据 CRC 确定图片的宽和高,而这里 crc 也被改了,所以无法通过前面的代码确定宽和高。
这里是进行暴力破解,相当于宽度的每个数字都跑出来,看哪个是正确的。
python脚本:

import zlib
import struct
filename = "C:/Users/Goodric/Desktop/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()

来源:https://blog.csdn.net/weixin_45696568/article/details/115261347

这一行代码,不懂脚本的我一开始一直不知道数字 16-20 代表的是什么意思,后面发现就是文件 16 进制中宽度字节的位置,从 17 字节到 20 字节。

im = all_b[:16]+struct.pack(’>i’,i)+all_b[20:]

运行脚本之后,会看到代码文件的同级目录下会出现每个宽度的图片,然后找到正确宽度的图片,可看到 flag 。并且可以看到,正确图片宽度为 1123 。
ctfshow{03e102077e3e5de9dd9c04aba16ef014}

——
——

misc35

题目描述: 出题人负隅顽抗,但我们知道正确宽度肯定大于900
python 暴力破解代码:

import zlib
import struct
filename = "C:/Users/Goodric/Desktop/misc35.jpg"
with open(filename, 'rb') as f:
all_b = f.read()
#w = all_b[159:161]
#h = all_b[157:159]
for i in range(901,1200):
name = str(i) + ".jpg"
f1 = open(name,"wb")
im = all_b[:159]+struct.pack('>h',i)+all_b[161:]
f1.write(im)
f1.close()

运行后,发现每张图片还是没有 flag ,每张图片都是空白。
得知这题还结合了前面一个“flag 在图片下面”,需要先把图片高度改高,这里改成 600 足够了。
再运行代码,看到 宽度为 993-1000 时,可以看到 flag 。
ctfshow{ca35201ca9ed607e5a68f44ef573fbc3}

——
——

misc36

题目描述:出题人坦白从宽,正确的宽度在920-950之间
下载附件为 gif 格式的图片。同样是进行暴力破解。先把高度改高一点。
python 代码:

import zlib
import struct
filename = "misc36.gif"
with open(filename, 'rb') as f:
    all_b = f.read()
    for i in range(920,951):
        name = str(i) + ".gif"
        f1 = open(name,"wb")
        im = all_b[:38]+struct.pack('>h',i)[::-1]+all_b[40:]
        f1.write(im)
        f1.close()

运行代码,看到宽度为 941 的图片显示 flag 。
直接打开无法查看,可以用 StegSolve 打开。
ctfshow{1ebf739f832906d60f57436b8179166f}

——
——

misc37

题目描述: flag在图片里
下载附件为一张 gif 动图,用 StegSolve 打开,查看每一帧的内容,
从第 9 、14、21、31、34 帧中得到 flag 。
ctfshow{2056782cd57b13261dcbbe3d6eecda17}

——
——

misc38

题目描述: flag在图片里
这个是 apng 图片,像 gif 一样会动, 可以理解为 PNG 版的 GIF 动画图片。
我这里用 Honeyview 打开可以看到动图,也可以查看每一帧的内容。
最终,在 9、17、36、40 帧中得到 flag 。
ctfshow{48b722b570c603ef58cc0b83bbf7680d}

——
——

misc39

题目描述: flag就像水,忽快忽慢地流
下载图片为一个 gif 动图,共有 287 帧图片,但是并没有 flag 的内容。
这题是 gif 帧数间隔隐写,就是动图每一帧播放的速度时间都是不一样的。
需要用到 Linux 下的工具 identify ,
Linux 下的安装命令:

sudo apt-get install imagemagick

用命令提取帧数:

identify -format "%T " misc39.gif > 1.txt

打开 1.txt 里面一串 36 和 37 的数字,把 37 换成1、36 换成 0,就得到长度为 287 的二进制字符串。
然后 flag 有 41 个字符,287/41 = 7 ,所以把每 7 位转一个字符。(正常是 8 位二进制转一个字符)
这里用代码实现:

s = '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'
s = s.replace('37','1').replace('36','0').replace(' ','')# s = s[1:]print(s)print(len(s))for i in range(len(s)//7):
try:
print(chr(int(s[i*7:i*7+7],2)),end='')
except:
pass

运行得到 flag :ctfshow{52812ff995fb7be268d963a9ebca0459}

——
——

misc40

题目描述: flag就像歌,有长有短仿佛岁月悠悠
用图片浏览器打开,看到是一张动图,即 apng 图片。

这里用到一个工具 APNG Disassembler 。
APNG图片分解器(APNG Disassembler)是一个用来分解APNG图片的软件,使用这个工具你可以把APNG动画图片中的每一帧都分解出来,并且把帧导出保存为图片文件。
工具处理图片后,除了每一帧图片外,每张图片还带有一个 txt 文件,内容像这样。

用 python 代码脚本提取每个 txt 文件的内容。(从每个 txt 文本中的第七个字符开始取)
大佬 wp 中说从第 28 个 txt 文本开始,到最后的第 68 个,前面的为干扰数据。共 41 个文本,刚好每个文本中的数字转换为一个字符,组成 41 个字符的 flag 。

flag=""
for i in range(28,69): #flag内容从28位开始
f = open('C:/Users/Goodric/Desktop/mix/apngframe'+str(i)+'.txt')
s = f.read()
flag += chr(int(s.split("/")[0][6:]))
print(flag)

运行得到 flag :ctfshow{95ca0297dff0f6b1bdaca394a6fcb95b}

以上是关于ctfshow 做题 MISC入门 模块 31-40的主要内容,如果未能解决你的问题,请参考以下文章

ctfshow 做题 MISC入门 模块 11-20

ctfshow 做题 MISC入门 模块 21~30

ctfshow 做题 MISC入门 模块 41-50

ctfshow 做题 MISC入门 模块 41-50

ctfshow 信息搜集模块做题 web1~20

ctfshow-Misc入门