画地圈羊

画地圈羊

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

打开题目给的数据,是一堆字符,,,大致看了一下,是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_data2


file = 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 += result

f.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)


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值