本篇由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一分为二


拿到附件解压后是一张图片,还是拖进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 video.release() image=image[100:400,250:500] gray_image=cv2.cvtColor(image,cv2.COLOR_BGR2GRAY) 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])]] 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) 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


附件还是两张不同的,先拖进010对比,但并没有用的信息
这道题还是盲水印
实用工具:BlindWaterMark-master
将两张图片放到工具里,cmd打开终端
输入:
python bwmforpy3.py decode you.png you_and_me.png flag.png

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

flag:ctfshow{CDEASEFFR8846}