画地圈羊

画地圈羊

一道很 讨厌烦人无聊 有趣的题:

打开题目给的数据,是一堆字符,,,大致看了一下,是160 * 640 的字符。

因为提前知道这个一个二维码,入手也就比较简单了,分析一下,大体思路是:

现将上面的字符串(十六进制)转化为四位的二进制字符串,我们就得到一个640 * 640 的字符串,然后通过python的画图工具将其画出。

这个过程还是比较顺利的,画出图片为:

没想到这么简单!!!!

兴奋地用微信扫了扫,什么都没有。。。

改用QR Research:

我很接近了???这样的提示一点信息都没,,观察了很久很久很久。。


一年以后


终于发现,在这个二维码的中间好像还有一个二维码!!!!!!

太心机了,用python将图片中间40 * 40 的像素单独画出来,

因为怕太过于模糊,我将图片进行了放大操作,就是将一个像素转化为四个。

比如说,二维码开始是:

1 0

0 1

放大后便是:

1 1 0 0

1 1 0 0

0 0 1 1

0 0 1 1

(似乎这个操作有点多余,不过既然写了,还是记录一下吧)

得到二号二维码!!!!

似乎有点小,如果不变大的会更小。。。

放入软件中:

哈哈哈,聪明如斯。。

最后附上我的代码:

from PIL import Image### 这个函数的作用是通过字符串绘制一个long*long大小的图片
def huitu(str_data,name,long):img = Image.new("RGB",(long,long))###创建一个long*long的图片for i in range(long):for j in range(long):if int(str_data[long * i + j]) == 1:img.putpixel((i,j),(0,0,0))### 字符为1的时候,画一个黑色的像素else:img.putpixel((i,j),(255,255,255))### 画一个白色的像素img.save(name +".png")# 将二维码清晰化,将一个像素转化为四个
# 比如说 字符串是: 
# 1 0
# 0 1
# 转化为:
# 1 1 0 0
# 1 1 0 0
# 0 0 1 1
# 0 0 1 1  
def kuozhan(str_data,long):new_data1 = ''new_data2 = ''for i in range(len(str_data)):new_data1 += str_data[i] + str_data[i]for i in range(long):new_data2 += new_data1[i * long * 2:(i + 1) * long * 2] + new_data1[i * long * 2:(i + 1) * long * 2]return new_data2file = r'C:/Users/lenovo/Desktop/demo/CTF练习题/画地圈羊/sheep.data'
f = open(file,'r')str_data = ''result = f.readline(0)
for i in range(640):for x in f.readline():if x != '\n':result = (bin(int(x,16)).replace('0b',''))# 十六进制转为二进制,并且将二进制开头的0b去掉while(len(result) != 4):result = '0' + result# 固定转为的二进制是4位的str_data += resultf.close()# 取出中间部分40 * 40 的方块
str_small = ''
long = 40 
long_2 = int((640 - long) / 2)
for i in range(long):str_small += str_data[(long_2 + i) * 640 + long_2:(long_2 + i) * 640 + long_2 + long]new_data = kuozhan(str_small,40)
huitu(str_data,'first',640)
huitu(new_data,'second',80)