misc9

使用notepad打开即可查找到flag。

这里使用strings命令

misc10

binwalk 可以一把梭

misc11

删除第一个IDAT块保存即可 工具:Tweakpng

misc12

删除前8个IDAT块

关于png格式分析文章传送门:https://www.cnblogs.com/lidabo/p/3701197.html

misc13

根据提示寻找flag

将选中部分取下,隔一个字节单独取出,再转为字符串即可

1
2
3
4
5
6
7
8
s='63 1A 74 B9 66 85 73 86 68 AA 6F 4B 77 B0 7B 21 61 14 65 53 36 A5 65 54 33 34 65 78 61 25 34 DD 38 EF 66 AB 35 10 31 95 38 1F 62 82 37 BA 65 45 34 7C 32 54 64 7E 37 3A 64 E4 65 F1 36 FA 66 F5 34 1E 31 07 32 1D 66 54 38 F1 33 32 39 E9 61 6C 7D'.replace(' ','')
flag=""
for i in range(0,len(s),4):
flag+=s[i]
flag+=s[i+1]
print(flag)


misc14

从图片所示位置选中至结尾另存为一张图片即为flag

misc15

记事本打开即可发现flag

misc16

使用binwalk,再cat分离出的文件

misc17

zsteg图片,发现信息再extradata:0处。提取后用binwalk可以分理出一张图片,即为flag

misc18

按照提示打开照片属性即可

misc19

这一题需要使用exif查看图片信息,在线网址

也可以直接用hexeditor或者notepad打开搜索两个字符串,拼接后即为flag

misc20

这题原理同上

misc21

根据提示,使用前两题使用的在线工具查看序列号

将序列号转字符,得到提示

寻找可能成为x,y的值,并且将其拼接后转16进制

结果错了,尝试将四个数据分别转换后再拼接才行。

misc22

本题为thumbnail隐写,使用工具:exiftool将flag隐藏于文件缩略图中。

隐写后使用Stegsolve,MagicEXIF或XnView等工具即可查看缩略图获取隐藏信息

misc23

首先使用上题提到的exiftool查看图片信息,在history action一栏找到提示,时间戳与16进制

使用在线网址转换四个时间得到四段时间戳:874865822 2699237688 2156662245 460377706

按照21的经验,将以上四段时间戳分别换为16进制再拼接即可。

misc24

位图格式分析

文件共占用675056字节,根据题目提示,这题的flag被隐藏于图片上面,猜测应该是修改了图片高度

去除文件头以及windows“补零”后占用的空间,真实的文件大小应该为675056-56=675000字节。其中,每个像素点由三个字节控制(R、G、B),因此,图像的像素总大小为675000/3=225000

再用图片的宽度(上图红框部分)去除225000得到正确的高度(上图蓝框部分)即可得到flag

即22500/900=250=0xFA

misc25

png文件格式详解

用tweakpng打开文件,提示crc错误,这是因为修改了高宽,却没有修改CRC,导致读取报错。在linux系统中这样的图片将无法打开。

对于这题具体分析如下,其中CRC校验码由IDCH和IHDR共17位字节计算得到。

1
2
3
4
5
6
7
89 50 4E 47 0D 0A 1A 0A                 //PNG格式固定开头
00 00 00 0D //数据块长度为13
49 48 44 52 //文件头数据块表示IDCH
00 00 03 84 //宽
00 00 00 96 //高
08 02 00 00 00 //五个字节依次为Bit depth,ColorType,Compression method,Filter method,Interlace method
76 EC 1E 40 //文件的CRC校验码

使用脚本爆破图片的高:

1
2
3
4
5
6
7
8
9
10
11
12
#crc.py
import binascii
import struct

crc32key=0x76EC1E40
for i in range(0,65535): #0xffff=65535
height=struct.pack('>i',i)
data='\x49\x48\x44\x52\x00\x00\x03\x84'+str(height)+'\x08\x02\x00\x00\x00'
crc32result=binascii.crc32(data) & 0xffffffff
if crc32result ==crc32key:
print ''.join(map(lambda c: "%02X" % ord(c), height))

将高修改为FA即可看到flag

misc26

使用上题的脚本爆破本题原来的高度为0x25E,修改后看到

填入真正的高度提交即可。

misc27

jpg格式文件详解

这题暂时没有找到更优的解法,查看属性得知

图片的宽度为150,对应十六进制的96.使用16进制查看器搜索十六进制96,将它修改为较大的值。

misc28

解法同上题,格式为gif,仅有一帧。值得注意的是,这题有多个十六进制字段为96,但只有一个表示图片的高度。这里使用010editor的gif.bt模板可以更清楚地浏览和修改图片的宽高(图片标记处)。后使用22题提到过的查看器在缩略图中即可查看flag。

misc29

格式同上题,但是本题图片共10帧。修改每一帧的高,发现flag藏于第八帧下。

Misc30

本题为24题的复刻版,本题修改的是宽度,950即十六进制的3B6,但是bmp格式采用小端储存方式,所以要改成B603

misc31

计算方式同24,计算得到宽度为1082(舍去余数),即0x43A

misc32

这题和25类似,都可以用之前的脚本根据crc32爆破出正确的宽高(前提是直到其中的一个正确值)

图中结果为16进制。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
import binascii

import struct



crc32key=0xE14A4C0B

for i in range(0,65535): #0xffff=65535

width=struct.pack('>i',i)

data='\x49\x48\x44\x52'+str(width)+'\x00\x00\x00\x96\x08\x02\x00\x00\x00'

crc32result=binascii.crc32(data) & 0xffffffff

if crc32result ==crc32key:

print ''.join(map(lambda c: "%02X" % ord(c), width))


misc33

这里贴上一个别人的同时爆破png图片宽高的脚本。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
import zlib
import struct

# 同时爆破宽度和高度
filename = "misc33.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 == 0x5255A798:
print("宽为:", end = '')
print(width, end = ' ')
print(int.from_bytes(width, byteorder='big'))
print("高为:", end = '')
print(height, end = ' ')
print(int.from_bytes(height, byteorder='big'))

misc34

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

本题校验码也被修改,根据提示,将所有900-1200范围内的宽度图片都保存下来,再观察哪个是正确的结果:

1
2
3
4
5
6
7
8
9
10
11
import struct
filename = "misc34.png"
with open(filename, 'rb') as f:
all_b = f.read()
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()

misc35

算法同34,但是需要提前修改图片基础高度。这里我修改为0x0258

1
2
3
4
5
6
7
8
9
10
11
import struct
filename = "misc35.jpg"
with open(filename, 'rb') as f:
all_b = f.read()
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()

正确宽度为993-1000间的任何一个数字。

misc36

这题同样先修改图片高度。

1
2
3
4
5
6
7
8
9
10
11
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

misc37

stegsolve的framebrowser浏览各帧

misc38

同样是动图,用浏览器打开就可以看到效果。关于apng格式介绍:https://baike.baidu.com/item/APNG/3582613?fr=aladdin

本题工具:apng Disassembler

查看分解得到的每个帧