CTF | 2021 美团CTF Misc WriteUp


引言

美团网络安全高校挑战赛 MT-CTF

比赛时间: 2021-05-23 09:00 ~ 2021-05-23 21:00

比赛官网: https://www.ichunqiu.com/meituan

周末有个美团 CTF,然而那天白天一直在赶 DDL,么得办法。

貌似也没啥师傅打这个比赛,感觉惨惨淡淡的。

(估计是决赛和其他比赛冲突的原因吧,摊手

到了晚上问了下别的师傅,说 misc 题没什么人做出来,于是吃完饭咱就来看了看。

Misc

Different_Puzzle

这些图片好像不能用蛮力。

附件下载 提取码(GAME)备用下载

下载下来一个 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

decode

扫码得到 EuO9&cDH

然后在 flag.exe 输入就能得到 flag.txt 打开就是 flag。

flag{af26d693-2de2-4b16-be49-d95e83a43f76}

pixel

Colorful pixel image.

附件下载 提取码(GAME)备用下载

Hint: do you know knn?

这题做的时候咱就猜是不是要用机器学习来做个二分类,果然在比赛结束前十几分钟放了个 hint 说是 KNN,实锤了。

(只不过没时间做了倒是了

开局一张图加一个 txt。

pixel

useful.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')

得到一张二维码。

decrypt

扫描 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')

decrypt2

虽然有点模糊,但缩小一点还是能扫出来的。

flag{7he_p!xe1_wi7h_0ff5et}

小结

真就遇事不决,机器学习呗!

其他题倒没怎么看,咱只是佛系做做罢了。

唉,喵喵菜菜,爬走了。

(溜了溜了喵


文章作者: MiaoTony
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来源 MiaoTony !
评论
  目录