实验吧:print and scan

解题链接:http://www.shiyanbar.com/ctf/1860

题目中已经给出了提示,画一画,扫一扫,图出则flag见

这个没做就想到是一个二维码,最后解码就得到flag了

点击链接,下载了一个zip,解压出来一个txt,里面是一个一个的数字对

观察数字对,发现最小值都是10,最大值都是270,正好符合二维码的特点,最小值10说明有一个边,周围4个边都是白框,对吧~

然后第一个数字增加到最大,然后第二个数字增加

这明显的横纵坐标啊

然后就是编码绘图环节,最初我的思路是两个循环,然后横纵坐标自增,如果不等于print&scan.txt中行的值,则设该点的值为0,如果等于,则设该点值是255.

后来发现这么干并没有什么好处,根本不好写,还需要对读取文件的值进行存储,有点麻烦。

正好想到不如先初始化一个纯白的二维码,读取文件,读取到某行,将该行的点的坐标处设为黑点,这样即好实现,速度又快。

代码如下:

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}

点赞

发表评论

[2;3Rer>