引言
美团网络安全高校挑战赛 MT-CTF
比赛时间: 2021-05-23 09:00 ~ 2021-05-23 21:00
周末有个美团 CTF,然而那天白天一直在赶 DDL,么得办法。
貌似也没啥师傅打这个比赛,感觉惨惨淡淡的。
(估计是决赛和其他比赛冲突的原因吧,摊手
到了晚上问了下别的师傅,说 misc 题没什么人做出来,于是吃完饭咱就来看了看。
Misc
Different_Puzzle
这些图片好像不能用蛮力。
下载下来一个 null.vhd
这是一个 Windows 的虚拟磁盘文件,首先进计算机管理-磁盘管理,把盘挂上去。
得到一堆黑白相间的图片。
(flag.txt
是之后得到的)
图片高度都为100,宽度有所区别。盲猜是一维码了。
写个jio本合成一下。
其实写脚本的时候这里直接是 foremost 导出来的,按照 null.vhd
里存放的先后顺序。
import PIL.Image as Image
import os
IMAGES_PATH = r'.\Misc_Different_Puzzle\null.vhd_outfile\png\\'
IMAGE_SAVE_PATH = r'.\Misc_Different_Puzzle\\'
image_names = [x for x in os.listdir(IMAGES_PATH) if x.endswith('.png')]
to_image = Image.new('RGB', (300, 100))
x = 0
for img in image_names:
from_image = Image.open(IMAGES_PATH + img)
im_size = from_image.size
to_image.paste(from_image, (x, 0))
x += im_size[0]
to_image.show()
to_image.save('decode.png')
# EuO9&cDH
扫码得到 EuO9&cDH
然后在 flag.exe
输入就能得到 flag.txt
打开就是 flag。
flag{af26d693-2de2-4b16-be49-d95e83a43f76}
pixel
Colorful pixel image.
Hint: do you know knn?
这题做的时候咱就猜是不是要用机器学习来做个二分类,果然在比赛结束前十几分钟放了个 hint 说是 KNN,实锤了。
(只不过没时间做了倒是了
开局一张图加一个 txt。
useful.txt
一共 88209 行数据,正好是 297x297。
那说不定括号里就是 (R, G, B, A),把对应的颜色映射为 0 和 1,那就是二维码了吧。
写个 jio 本复原一下。
import re
from PIL import Image
with open('useful.txt', 'r', encoding='utf-8') as fin:
s = fin.read()
l = s.strip().split('\n')
# print(l)
re_info = re.compile(r'(\d) <--- (\(.*\))')
data = {}
for x in l:
info = re_info.search(x)
data[info[2]] = info[1]
# print(data)
im = Image.open('pixel.png')
print(im.size)
# (297, 297)
width = im.width
height = im.height
im2 = Image.new('RGBA', im.size)
for j in range(height):
for i in range(width):
x = im.getpixel((i, j))
if data[str(x)] == '1':
im2.putpixel((i, j), (0, 0, 0))
# else:
# im2.putpixel((i, j), (255, 255, 255))
# im2.show()
im2.save('decrypt2.png')
得到一张二维码。
扫描 QR 得到 8c8040579121e55ca4c58f9
,拿去解压。
得到还是一张像素点混乱的图和一个和之前类似的文本。
但是这次的 RGBA 并不能对应上。
于是考虑是不是要做个二分类,就把四维的 RGBA 分为两类,分别对应着黑和白两种结果。
首先用所给的数据作为训练集得到一个模型,然后在 flag.png
上作为测试集进行预测,从而得到一个黑白图像,大概率也是 QR码 或者 比较容易辨识的图形。
参考 KNN分类算法原理及实现及sklearn中的使用方法,机器学习之KNN最邻近分类算法
咱就整个 KNN 出来吧。
这里直接用 sklearn 里自带的 KNN 来实现了。
# 导入画图工具
import matplotlib.pyplot as plt
# 导入数组工具
import numpy as np
# 导入数据集生成器
from sklearn.datasets import make_blobs
# 导入KNN 分类器
from sklearn.neighbors import KNeighborsClassifier
# 导入数据集拆分工具
from sklearn.model_selection import train_test_split
import re
from PIL import Image
with open('flag/hint.txt', 'r', encoding='utf-8') as fin:
s = fin.read()
l = s.strip().split('\n')
re_info = re.compile(r'(\d) <--- (\(.*\))')
X = []
Y = []
for x in l:
info = re_info.search(x)
tmp1 = int(info[1])
tmp2 = eval(info[2])
X.append(tmp2)
Y.append(tmp1)
clf = KNeighborsClassifier()
clf.fit(X, Y)
im = Image.open('flag/flag.png')
print(im.size)
# (297, 297)
width = im.width
height = im.height
im2 = Image.new('RGBA', im.size)
for j in range(height):
for i in range(width):
x = im.getpixel((i, j))
res = clf.predict([x])[0]
print(res)
if res == 1:
im2.putpixel((i, j), (0, 0, 0))
im2.show()
im2.save('decrypt2.png')
虽然有点模糊,但缩小一点还是能扫出来的。
flag{7he_p!xe1_wi7h_0ff5et}
小结
真就遇事不决,机器学习呗!
其他题倒没怎么看,咱只是佛系做做罢了。
唉,喵喵菜菜,爬走了。
(溜了溜了喵