本篇由CTF show新手必刷菜狗杯平台和各个师傅的提供

为了方便阅读,文章会尽量将每一步操作、每一个知识点都解释清楚

如果已经有一定基础,也可以将本文作为一次简单的复盘参考

有什么问题和建议可以私聊我,感谢各位读者

杂项签到

杂项签到

杂项题

拿到附件解压.png格式,优先考虑图片隐写

打开010或winhex工具查看十六进制,调整宽高调试并没有找到falg

杂项题

直接搜索ctf或者flag试试看,直接搜出来了

杂项题

flag:ctfshow{a62b0b55682d81f7f652b26147c49040}

损坏的压缩包

损坏的压缩包

杂项题

拿到附件解压解压错误,不是个zip的包

打开010或winhex工具查看十六进制,看到头是png,把文件后缀改成.png格式

杂项题

flag:ctfshow{e19efe2eb86f10ccd7ca362110903c05}

谜之栅栏

谜之栅栏

杂项题

附件给了两张图片,直接打开010工具是用工具的比较文件

把两张png导入进去进行对比

杂项题

杂项题

可以看到两张图片给了flag,根据题目栅栏提示可以想到栅栏解码

杂项题

杂项题

复制两段cfhwfaab2cb4af5a5820}Ltso{06071f997b5bdd1a

交给解码工具分为2栏会得到flag

flag:ctfshow{f0a6a0b721cfb949a7fb55ab5d8d210a}

你会数数吗

你会数数吗

杂项题

附件没有后缀名,先拖进010工具伺候

杂项题

可以看到一堆乱码

根据题目提示可能是词频统计

在工具里找到直方图

杂项题

杂项题

计数从大到小排列就可以看到flag个了。

杂项题

flag:ctfshow{a1b2d3e4g56i7j8k9l0}

你会异或吗

你会异或吗

下载附件之后文件.png格式文件是损坏的,直接拖进010工具

杂项题

里面是一堆乱码什么都搜索不到根据题目提示:你会异或吗 神秘数字:0x50

使用工具 十六进制运算二进制异或

杂项题

杂项题

给了png的图片ctrl+s保存

杂项题

拿到flag

杂项题

flag:ctfshow{030d0f5073ab4681d30866d1fdf10ab1}

flag一分为二

flag一分为二

杂项题

拿到附件解压后是一张图片,还是拖进010工具

宽高给小了,可以给大一点,保存

杂项题

杂项题

有信息SecondP@rTMikumiku~},但并不是最终的flag

看提示应该不是一般的图片隐写,这里引入了一个盲水印

使用工具:WaterMar

杂项题

将图片放到工具里面,提取出来得到信息ctfshow{FirstP@RT

杂项题

将两张的信息结合就是最终的flag

ctfshow{FirstP@RTSecondP@rTMikumiku~}

我是谁??

我是谁??

进到给的地址里, 这道题的本质:疯狂的“看剪影猜动漫人物”

杂项题

杂项题

这个关卡其实是一个小游戏:

服务器会给你一段视频,里面有一个动漫角色的黑色剪影

同时有一张包含了所有角色的合集大图,排列成类似排座位一样的格子(A0, A1, … J9)

游戏要求:必须连续猜对 30 次以上这个剪影是哪个格子里的角色,服务器才会把 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
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
import requests
from lxml import html
import cv2
import numpy as np
import json


url="http://xxxxxxxxxxxxxxxxxxxx.challenge.ctf.show"

sess=requests.session()

all_girl=sess.get(url+'/static/all_girl.png').content

with open('all_girl.png','wb')as f:
f.write(all_girl)

big_pic=cv2.imdecode(np.fromfile('all_girl.png', dtype=np.uint8), cv2.IMREAD_UNCHANGED)
big_pic=big_pic[50:,50:,:]
image_alpha = big_pic[:, :, 3]
mask_img=np.zeros((big_pic.shape[0],big_pic.shape[1]), np.uint8)
mask_img[np.where(image_alpha == 0)] = 255

cv2.imwrite('big.png',mask_img)



def answer_one(sess):
#获取视频文件
response=sess.get(url+'/check')
if 'ctfshow{' in response.text:
print(response.text)
exit(0)
tree=html.fromstring(response.text)
element=tree.xpath('//source[@id="vsource"]')
video_path=element[0].get('src')
video_bin=sess.get(url+video_path).content
with open('Question.mp4','wb')as f:
f.write(video_bin)
#获取有效帧
video = cv2.VideoCapture('Question.mp4')
frame=0
while frame<=55:
res, image = video.read()
frame+=1
#cv2.imwrite('temp.png',image)
video.release()
#获取剪影
image=image[100:400,250:500]
gray_image=cv2.cvtColor(image,cv2.COLOR_BGR2GRAY)
#cv2.imwrite('gray_image.png',gray_image)
temp = np.zeros((300, 250), np.uint8)
temp[np.where(gray_image>=128)]=255
#去白边
temp = temp[[not np.all(temp[i] == 255) for i in range(temp.shape[0])], :]
temp = temp[:, [not np.all(temp[:, i] == 255) for i in range(temp.shape[1])]]
#缩放至合适大小,肉眼大致判断是1.2倍,不一定准
temp = cv2.resize(temp,None,fx=1.2,fy=1.2)
#查找位置
res =cv2.matchTemplate( mask_img,temp,cv2.TM_CCOEFF_NORMED)
min_val, max_val, min_loc, max_loc = cv2.minMaxLoc(res)
x,y=int(max_loc[0]/192),int(max_loc[1]/288)#为什么是192和288,因为大图去掉标题栏就是1920*2880
guess='ABCDEFGHIJ'[y]+'0123456789'[x]
print(f'guess:{guess}')
#传答案
response=sess.get(url+'/submit?guess='+guess)
r=json.loads(response.text)
if r['result']:
print('guess right!')
return True
else:
print('guess wrong!')
return False

i=1

while i<=31:
print(f'Round:{i}')
if answer_one(sess):
i+=1
else:
i=1

把地址改掉,跑一遍就会拿到随机flag

You and me

You and me

杂项题

附件还是两张不同的,先拖进010对比,但并没有用的信息

这道题还是盲水印

实用工具:BlindWaterMark-master

将两张图片放到工具里,cmd打开终端

输入:

python bwmforpy3.py decode you.png you_and_me.png flag.png

杂项题

这是执行完会在工具里给出flag.png

杂项题

flag:ctfshow{CDEASEFFR8846}