misc 1

图片上直接就是flag
ctfshow{22f1fb91fc4169f1c9411ce632a0ed8d}

misc 2

打开是图片的十六进制,直接转图片,拿到flag
ctfshow{6f66202f21ad22a2a19520cdd3f69e7b}

image-20241019224000240

misc 3

bpg格式,查看拿到flag
ctfshow{aade771916df7cde3009c0e631f9910d}

misc 4

被拆分了,改文件后缀就行
ctfshow{4314e2b15ad9a960e7d9d8fc2ff902da}

misc 5

藏在文件信息头中

image-20241019230410154

ctfshow{2a476b4011805f1a8e4b906c8f84083e}

misc 6

010直接看,拿到ctfshow{d5e937aefb091d38e70d927b80e1e2ea}

misc 7

010直接看,拿到ctfshow{c5e77c9c289275e3f307362e1ed86bb7}

misc 8

flag在图片文件中图片文件中。

foremost提取出来一张png,拿到ctfshow{1df0a9a3f709a2605803664b55783687}

misc 9

flag在图片块里。

010直接看,拿到ctfshow{5c5e819508a3ab1fd823f11e83e93c75}

misc 10

flag在图片数据里。

binwalk提取出来,10E5打开拿到ctfshow{353252424ac69cb64f643768851ac790}

misc 11

flag在另一张图里。

把第二个 IDAT 数据删除,重新打开图片发现有flag:ctfshow{44620176948fa759d3eeafeac99f1ce9}

misc 12

flag在另一张图里。

和11解法一样,不过是多删几个
ctfshow{10ea26425dd4708f7da7a13c8e256a73}

misc 13

flag位置在图片末尾。

ct¹f…s†hªoKw°{!aeS6¥eT446xc%4Ý8ïf«73•9b‚7ºeEb|2Td~1:däeñ6úeõ412fT8ñ329éal}
隔一个提取,一共有四串,但只有一个为真
ctfshow{ae6e46c48f739b7eb2d1de6e412f839a}
ctfshow{ae6e3ea48f518b7e42d7de6f412f839a}真
ctfshow{1e3e2ed48f518b7e4267de1c412a839a}
ctfshow{ae6e3fa48f528b1742d72e6f41298380}

misc 14

flag在那张图里。

binwalk自动提取失败,使用dd手动提取

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
binwalk -e --run-as=root ./misc14.jpg

DECIMAL HEXADECIMAL DESCRIPTION
--------------------------------------------------------------------------------
0 0x0 JPEG image data, EXIF standard
12 0xC TIFF image data, big-endian, offset of first image directory: 8
1681 0x691 TIFF image data, big-endian, offset of first image directory: 8
2103 0x837 JPEG image data, JFIF standard 1.01

# 提取从 0x0 开始的 JPEG 图像
dd if=misc14.jpg of=image1.jpg bs=1 skip=0 count=2103

# 提取从 0xC 开始的 TIFF 图像
dd if=misc14.jpg of=image2.tiff bs=1 skip=12 count=1673

# 提取从 0x691 开始的另一个 TIFF 图像
dd if=misc14.jpg of=image3.tiff bs=1 skip=1681 count=422

# 提取从 0x837 开始的 JPEG 图像
dd if=misc14.jpg of=image4.jpg bs=1 skip=2103

拿到flag:ctfshow{ce520f767fc465b0787cdb936363e694}
也可以复制在010里FFD8FF到FFD9的部分,然后新建一个PNG图片

misc 15

flag被跳过去了。

010直接拿到flag:ctfshow{fbe7bb657397e6e0a6adea3e40265425}

misc 16

flag在图片数据里。

binwalk提取ctfshow{a7e32f131c011290a62476ae77190b52}

misc 17

flag在图片数据里。

Pasted image 20241021084923

使用zsteg发现隐写数据,然后分离,再使用binwalk分离,拿到一张png图片,图片上就是flag
ctfshow{0fe61fc42e8bbe55b9257d251749ae45}

misc 18

flag在标题、作者、照相机和镜头型号里。

按照题目,查看属性拿到flag。ctfshow{325d60c208f728ac17e5f02d4cf5a839}

misc 19

flag在主机上的文档名里。

010打开,拿到flag

Pasted image 20241021085250

ctfshow{dfdcf08038cd446a5eb50782f8d3605d}

或者是使用exiftool或在线exif查看器
用strings也可以,flag就在最上边

misc 20

flag在评论里。

exiftools查看,发现西替爱抚秀大括号西九七九六四必一诶易西爱抚零六易一弟七九西二一弟弟诶弟五九三易四二大括号
ctfshow{c97964b1aecf06e1d79c21ddad593e42}

misc 20

flag在序号里。

exiftool发现ctfshow{}和686578285826597329,686578285826597329=>hex(X&Ys)

Pasted image 20241021093309

最终发现是分段十进制数转十六进制数,3902939465=>e8a22149
ctfshow{e8a221498d5c073b4084eb51b1a1686d}

misc 22

flag在图片里。

缩略图隐写(thumbnail隐写),可以用magicexif,或者随波逐流,也可以用exiftool

1
exiftool -ThumbnailImage -b misc22.jpg > 1.jpg

ctfshow{dbf7d3f84b0125e833dfd3c80820a129}

misc 23

flag在时间里。

exiftool查看发现

Pasted image 20241021095447

ctfshow{}, UnixTimestamp=>时间戳, DECtoHEX=>十进制数转十六进制数,getflag
1997-09-22 02:17:02+08:00, 2055-07-15 12:14:48+08:00, 2038-05-05 16:50:45+08:00, 1984-08-03 18:41:46+08:00
874865822

1
2
3
4
1997-09-22 02:17:02+08:00 => 874865822  => 3425649e
2055-07-15 12:14:48+08:00 => 2699237688 => a0e31938
2038-05-05 16:50:45+08:00 => 2156662245 => 808c0de5
1984-08-03 18:41:46+08:00 => 460377706 => 1b70ce6a

ctfshow{3425649ea0e31938808c0de51b70ce6a}

misc 24

flag在图片上面。

BMP宽高修复,直接用PuzzleSolve一把梭就行,也可手动改高度为FA,flag:
ctfshow{dd7d8bc9e5e873eb7da3fa51d92ca4b7}

misc 25

flag在图片下面。

PNG图片宽高修复,属于CRC校验那种,一把梭or手动改,仍是FA,flag:
ctfshow{494f611cc5842dd597f460874ce38f57}

misc 26

flag还是在图片下面,但到底有多下面?。

同25,flag:ctfshow{94aef125e087a7ccf2e28e742efd704c}

misc 27

flag在图片下面

JPG宽高修复,flag:ctfshow{5cc4f19eb01705b99bf41492430a1a14}

misc 28

flag在图片下面。

GIF宽高修复,flag:ctfshow{59c8bc525426166b1c893fe12a387fd7}

misc 29

flag在图片下面。

同28,010查找每一帧的高度9600替换为FF00,然后拆帧,拿到flag
ctfshow{03ce5be6d60a4b3c7465ab9410801440}

misc 30

正确的宽度是950。

照着题目做就行,拿到flag:ctfshow{6db8536da312f6aeb42da2f45b5f213c}

misc 31

高度是正确的,但正确的宽度是多少呢。

PuzzleSolve一把梭,flag:ctfshow{fb09dcc9005fe3feeefb73646b55efd5}

misc 32

高度是正确的,但正确的宽度是多少呢

宽高修复一把梭,flag:ctfshow{685082227bcf70d17d1b39a5c1195aa9}

misc 33

出题人丧心病狂,把高度也改了

宽高修复一把梭,flag为:ctfshow{03070a10ec3a3282ba1e352f4e07b0a9}

misc 34

出题人狗急跳墙,把IHDR块的CRC也改了,但我们知道正确宽度肯定大于900

宽高修复一把梭,flag为:ctfshow{03e102077e3e5de9dd9c04aba16ef014}

misc 35

出题人负隅顽抗,但我们知道正确宽度肯定大于900

先改高度,改到600,看到下边有一坨乱码,证明高度差不多了。然后开始遍历宽度,在990到1000左右都能正常显示。

1
2
3
4
5
6
7
8
9
10
import struct
filename = "misc35.jpg"
with open(filename, 'rb') as f:
data = f.read()
for i in range(901,1200):
name = str(i) + ".jpg"
f1 = open(name,"wb")
new = data[:159]+struct.pack('>h',i)+data[161:]
f1.write(new)
f1.close()

ctfshow{ca35201ca9ed607e5a68f44ef573fbc3}

misc 36

出题人坦白从宽,正确的宽度在920-950之间

先改高度为FF00,然后进行遍历,最后发现941应该是原来的宽度,flag:ctfshow{1ebf739f832906d60f57436b8179166f}
遍历脚本:

1
2
3
4
5
6
7
8
9
10
import struct
filename = "misc36.gif"
with open(filename, 'rb') as f:
data = f.read()
for i in range(920,951):
name = str(i) + ".gif"
f1 = open(name,"wb")
new = data[:38]+struct.pack('>h',i)[::-1]+data[40:]
f1.write(new)
f1.close()

misc 37

flag在图片里

是GIF动图,直接拆,flag在第8、13、20、30、33帧
ctfshow{2056782cd57b13261dcbbe3d6eecda17}

misc 38

flag在图片里

用010打开,发现有8个FFD9,十分有九分的不对劲,看了其他大佬的wp发现是APNG格式
可以用honeyview/bandview逐帧查看,也可以用apng直接拆/转gif后拆。
flag为:ctfshow{48b722b570c603ef58cc0b83bbf7680d}

misc 39

flag就像水,忽快忽慢地流

是GIF时间间隔隐写,用PuzzleSolve一把梭,提取出时间间隔,然后360=>0,370=>1,最后再按照七位二进制数转ASCII字符串。也可用 imagemagick工具:identify -format “%T “ misc39.gif提取出,不过是36=>0,37=>1。下边为Python脚本实现

1
2
3
4
5
6
7
8
9
with open("./1.txt", "r") as file:
data = eval(file.read())
# data = file.read().split()
# 替换规则:360 -> 0, 370 -> 1
binary_string = ''.join(['0' if num == '360' else '1' for num in data])
# binary_string = ''.join(['0' if num == '36' else '1' for num in data])
ascii_string = ''.join([chr(int(binary_string[i:i+7], 2)) for i in range(0, len(binary_string), 7)])

print(ascii_string)

flag为ctfshow{52812ff995fb7be268d963a9ebca0459}

misc 40

flag就像歌,有长有短仿佛岁月悠悠

又是一个apng,拆了,应该是在apngframe01.txt这种记录详细信息文件中的隐写

1
2
3
4
5
6
7
8
9
flag = ""
for i in range(1, 69):
with open('./misc40/apngframe%02d.txt' % i) as f:
s = f.read()
c = int(s.split("/")[0][6:])
print(c,end=" ")
flag += chr(c)

print(flag)

![Pasted image 20241021224514](../../../program/aaaaaaaaaaa/notes/ctfshow/misc入门/image/Pasted image 20241021224514.png)

flag:ctfshow{95ca0297dff0f6b1bdaca394a6fcb95b}

misc 41

(本题为Misc入门图片篇和愚人节比赛特别联动题)
H4ppy Apr1l F001’s D4y!
愚人节到了,一群笨蛋往南飞,一会儿排成S字,一会儿排成B字。

发现少了文件头,补上,做不出来,还原。再看看题目,F001不是leet,是十六进制字节,搜索F001

Pasted image 20241021114909

拿到flag,ctfshow{fcbd427caf4a52f1147ab44346cd1cdd}

misc 42

flag有多长?2cm……不好意思打错了,41位

41位flag,扔随波逐流里发现不止一个IDAT块,也不是覆盖,看看长度,大多都在40多到126之间,那很有可能是ASCII码转字符串。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
with open('./misc42/1.txt', 'r', encoding='utf-8') as file:
data = file.readlines()

# 初始化flag字符串
flag = ""

# 遍历文件内容逐行提取长度并转换为ASCII字符
for line in data:
if "长度" in line:
# 提取长度值并转为整数,再转为对应的ASCII字符
length = int(line.split("长度: ")[1].split(",")[0])
print(length,end=" ")
flag += chr(length)

# 输出结果
print()
print(flag)

Pasted image 20241021231216

拿到flag,ctfshow{078cbd0f9c8d3f2158e70529f8913c65}

misc 43

错误中隐藏着通往正确答案的道路

扔随波逐流里,发现有12个IDAT块,11个长度大部分为384,且crc校验均是错误的。根据题面,将错误的crc校验码扔赛博厨子,拿到flag

Pasted image 20241022095645

flag:ctfshow{6eb2589ffff5e390fe6b87504dbc0892}

misc 44

错误中还隐藏着坑

扔随波逐流,发现有N多个IDAT块,crc校验True和False交替,应该是01替换,上脚本:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
def process_crc_file(file_path):
# 打开文件并读取所有行
with open(file_path, 'r', encoding='utf-8') as file:
lines = file.readlines()
binary_str = ''
# 按行提取 CRC 校验结果(True 或 False)
for line in lines:
if "CRC校验结果: " in line:
if "True" in line:
binary_str += '1'
else:
binary_str += '0'

# 将二进制串转换为十六进制串
hex_str = hex(int(binary_str, 2))[2:] # 去掉 '0x' 前缀

# 输出结果
print(f"Binary string: {binary_str}")
print(f"Hexadecimal string: {hex_str}")

process_crc_file('./1.txt')

然后把十六进制扔赛博厨子,拿到flag:ctfshow{cc1af32bf96308fc1263231be783f69e}

misc 45

有时候也需要换一换思维格式

换成bmp格式,然后binwalk提取出来一个压缩包,里边就是flag

1
2
3
4
from PIL import Image

img = Image.open('misc45.png')
img.save('misc45.bmp')

ctfshow{057a722a5587979c34966c2436283e70}

misc 46

你见过扶乩吗

打开图片发现这玩意儿到处晃,用identity查看发现,174+49这些偏移量

image-20241022164110167

根据GIF偏移量来绘图,绘制完,打开png图片就是flag

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
26
from PIL import Image
import struct

# 读取 GIF 文件并提取偏移量
def extract_offsets(gif_file):
point_list = []
with open(gif_file, 'rb') as f:
bin_data = f.read()
for i in range(len(bin_data)):
if i + 1 < len(bin_data) and bin_data[i] == 0x21 and bin_data[i + 1] == 0xF9:
l = struct.unpack('<H', bin_data[i + 9:i + 11])[0]
r = struct.unpack('<H', bin_data[i + 11:i + 13])[0]
point_list.append((l, r))

return point_list

# 根据偏移量绘制黑色像素点
def draw_image_from_offsets(offsets, image_size=(400, 70)):
img = Image.new('RGB', image_size, (255, 255, 255))
for i in offsets:
img.putpixel(i, (0, 0, 0))
img.save('flag46.png')

gif_file = 'misc46.gif'
offsets = extract_offsets(gif_file)
draw_image_from_offsets(offsets)

image-20241022164103111

flag为ctfshow{05906b3be8742a13a93898186bc5802f}

misc 47

没见过扶乩,那你知道笔仙吗

又是apng,在每一个IDAT块前面都会有一个fcTL块,从中可以获取水平垂直偏移量

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
26
import struct
from PIL import Image
import matplotlib.pyplot as plt

with open('misc47.png', 'rb') as f:
c = f.read()

c = c[c.index(bytes.fromhex('6663544C00000001')):]
pp = []

for i in range(1, 1124, 2):
start = c.index(bytes.fromhex('6663544C0000') + struct.pack('>h', i))
fc = c[start:start + 30]

x_offset = struct.unpack('>h', fc[18:20])[0]
y_offset = struct.unpack('>h', fc[22:24])[0]
pp.append((x_offset, y_offset))

img = Image.new('RGB', (400, 70), (255, 255, 255))


for i in pp:
if 0 <= i[0] < img.width and 0 <= i[1] < img.height:
img.putpixel(i, (0, 0, 0))

img.save('flag.png')

flag:ctfshow{6d51f85b45a0061754a2776a32cf26c4}

misc 48

附件的第(Di)七(Qi)题(Ti)中有提示。本题略脑洞,可跳过

用010打开看到提示,count FF & minus 1 ctfshow{32},翻译一下,应该是统计FF的数量,然后减一,flag ctfshow{中间有32个字符}

image-20241022164052068

上脚本:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
with open('misc48.jpg', 'rb') as f:
data = f.read()

ff_count_list = []
count = 0
str_num = 0

for byte in data:
if byte == 0xFF:
count += 1
else:
if count > 0:
str_num += 1
ff_count_list.append(count-1)
if str_num >= 32:
break
count = 0

hex_string = ''.join([hex(num)[2:] for num in ff_count_list])

print(ff_count_list)
print(f'ctfshow{{{hex_string}}}')

flag:ctfshow{0cb07add909d0d60a92101a8b5c7223a}

misc 49

它们一来就是十六种。本题略脑洞,可跳过

010打开看到有N多字符串,不正常,但对不上脑电波,查看其他大佬的wp发现是,提取出FFE?中的?位置的字符,拼接起来就是flag

1
2
3
4
5
6
7
8
9
10
11
12
with open('./misc49/misc49.jpg', 'rb') as f:
bin_data = f.read()

hex_data = bin_data.hex().upper()
l = hex_data.split("FFE")
flag = ""

for i in range(1, len(l)):
if len(l[i]) > 0:
flag += l[i][0]

print(f'ctfshow{{{flag.lower()[:32]}}}')

flag:ctfshow{0c618671a153f5da3948fdb2a2238e44}

misc 50

有时候视线也要放低一点
出题人说出完这题他就要跑路去玩MHR了,51题明年见

直接上stegsolve

image-20241022164039158

image-20241022164034839

image-20241022164030313

flag:ctfshow{84470883ee1eec2e886436461bf79111}

misc 53

开始愉快的LSB部分。

stegsolve直接出

image-20241022164024321

flag:ctfshow{69830d5a3a3b5006f7b11193e9bc22a2}

misc 54

还是愉快的LSB部分。

stegsolve直接出

image-20241022164017151

flag:ctfshow{b1f8ab24b8ca223d0affbf372ba0e4fa}

misc 55

怎么又是愉快的LSB部分。

发现图片是倒着的,逆转一下

1
2
3
4
5
6
from PIL import Image

img = Image.open('input.png')

flipped_img_vertical = img.transpose(Image.FLIP_TOP_BOTTOM)
flipped_img_vertical.save('flipped_vertical.png')

然后用stegsolve打开,发现zip文件头,保存,解压,拿到flag

image-20241022163959846

flag:ctfshow{daf256838e19a19d9e7b0a69642ad5ee}

misc 56

怎么老是愉快的LSB部分。

直接上stegsolve

image-20241022163935941

flag:ctfshow{1b30c28a5fca6cec5886b1d2cc8b1263}