【CTF】用python PIL将RGB值转化为图片

1. 题目介绍

题目的名称叫:神奇的二维码

flag格式为:flag{}

给出了一个flag.txt文件

链接:http://pan.baidu.com/s/1kUBHZBD 密码:zzxo

2. 思路分析

打开后发现是(255, 255, 255)和(0, 0, 0),这不是R.G.B嘛,(255, 255, 255)代表白色,(0, 0, 0)代表黑色。结合题目是二维码,想考差的就很明显了,那就是将这些RGB转换成像素输出成图片。

R.G.B白色和黑色

python里有个PIL库就是处理图片信息的,python3中已经换成了Pillow

flag.txt一共有78400行(最后一行是空行不计算在内),78400分解成2×2×2×2×2×2×5×5×7×7,组合了半天想起来二维码一般都是正方形的,正好78400是280的平方。

这里放出将RGB转换为像素的代码,本人菜狗子一个,如果有错误或者不足之处还望大佬们指出。

from PIL import Image

x = 280    #x坐标  通过对txt里的行数进行整数分解
y = 280    #y坐标  x * y = 行数

im = Image.new("RGB", (x, y))   #创建图片
file = open('flag.txt')    #打开rbg值的文件

#通过每个rgb点生成图片

for i in range(0, x):
    for j in range(0, y):
        line = file.readline()  #获取一行的rgb值
        rgb = line.split(", ")  #分离rgb,文本中逗号后面有空格
        im.putpixel((i, j), (int(rgb[0]), int(rgb[1]), int(rgb[2])))    #将rgb转化为像素

im.show()   #也可用im.save('flag.jpg')保存下来

这里需要注意的是文本中rbg值是用()括起来的,所以还要想办法把()解决掉才能运行。

运行后得到图片

二维码

扫码后得到一串字符:ONYXE6LSIVXF6ZTUOZTXWRRRIRPWCZLWORIGCLJQG56Q====

base32解码后得到

base32解码

发现位置是混乱的,想到了凯撒加密,但是凯撒解密出来都不对,想起来格式是flag,那么位置也被移位了,所以先用栅栏密码解码

栅栏密码解码

发现第1栏前面是4位,这时我们再拿去做凯撒解密

凯撒解密

3. 相关文档

Pillow库介绍:
原文档:http://pillow.readthedocs.io/en/latest/
翻译文档:http://www.cnblogs.com/apexchu/p/4231041.html

关于base64 32 16介绍:
http://xiaoqin00.blog.51cto.com/10468367/1718416

栅栏密码介绍:
百度百科:https://baike.baidu.com/item/%E6%A0%85%E6%A0%8F%E5%AF%86%E7%A0%81/228209?fr=aladdin

凯撒密码介绍:
百度百科:https://baike.baidu.com/item/%E6%81%BA%E6%92%92%E5%AF%86%E7%A0%81?fromtitle=%E5%87%AF%E6%92%92%E5%AF%86%E7%A0%81&fromid=1336345

  • 4
    点赞
  • 28
    收藏
    觉得还不错? 一键收藏
  • 10
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 10
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值