题目中已经给出了提示,画一画,扫一扫,图出则flag见 这个没做就想到是一个二维码,最后解码就得到flag了 点击链接,下载了一个zip,解压出来一个txt,里面是一个一个的数字对 观察数字对,发现最小值都是10,最大值都是270,正好符合二维码的特点,最小值10说明有一个边,周围4个边都是白框,对吧~ 然后第一个数字增加到最大,然后第二个数字增加 这明显的横纵坐标啊 然后就是编码绘图环节,最初我的思路是两个循环,然后横纵坐标自增,如果不等于print&scan.txt中行的值,则设该点的值为0,如果等于,则设该点值是255. 后来发现这么干并没有什么好处,根本不好写,还需要对读取文件的值进行存储,有点麻烦。 正好想到不如先初始化一个纯白的二维码,读取文件,读取到某行,将该行的点的坐标处设为黑点,这样即好实现,速度又快。 代码如下:解题链接:http://www.shiyanbar.com/ctf/1860
import numpy as np from PIL import Image f = open('Paint&Scan.txt','r') line = f.read() line = line.replace('(','').replace(')','').split('\r\n')[:-1] im = np.array([[255]*280]*280) for i in range(len(line)): x = int(line[i].split(',')[0]) y = int(line[i].split(',')[1]) im[x][y]=0 narray = np.matrix(im,dtype='uint8') img = Image.fromarray(narray) img.convert('L') img.show()然后生成的二维码如下:
对二维码进行在线扫描,得到flag:CTF{simplectf_QR_code}