CTF练习题[MISC]-0和1的故事(二维码生成)

练习题地址:https://ctf.bugku.com/challenges/detail/id/216.html

拿到题目,txt中是01字符串
在这里插入图片描述

Excel手动生成

在字符后插入空格
在这里插入图片描述

用Excel打开

在这里插入图片描述

使用空格分隔
在这里插入图片描述

在这里插入图片描述

调整列宽并设置条件格式

在这里插入图片描述

将值为1的单元格填充背景为黑色

在这里插入图片描述

值为0的单元格设置字体为白色

在这里插入图片描述

将二维码缺失的三角补上

在这里插入图片描述
扫描二维码获取flag

python脚本生成

生成图片https://blog.csdn.net/qq_43528553/article/details/119084941

from PIL import Image

with open("1和0的故事.txt", "r") as f:
    data = [list(i.strip()) for i in f.readlines()]

# 7*7的定位标志
flag = [
    [1, 1, 1, 1, 1, 1, 1],
    [1, 0, 0, 0, 0, 0, 1],
    [1, 0, 1, 1, 1, 0, 1],
    [1, 0, 1, 1, 1, 0, 1],
    [1, 0, 1, 1, 1, 0, 1],
    [1, 0, 0, 0, 0, 0, 1],
    [1, 1, 1, 1, 1, 1, 1]
]

img = Image.new("1", (25, 25))
for i in range(len(data)):
    for j in range(len(data[1])):
        # 左上角定位标志
        if i < 7 and j < 7:
            img.putpixel((i, j), flag[i][j] ^ 1)
        # 左下角定位标志
        elif i > 17 and j < 7:
            img.putpixel((i, j), flag[i-18][j] ^ 1)
        # 右上角定位标志
        elif i < 7 and j > 17:
            img.putpixel((i, j), flag[i][j-18] ^ 1)
        else:
            img.putpixel((i, j), int(data[i][j]) ^ 1)

img.resize((500, 500)).show()

修改了脚本,生成到Excel中

import xlwt

workbook=xlwt.Workbook()
worksheet=workbook.add_sheet('My Sheet')

# 颜色填充
pattern = xlwt.Pattern() # Create the Pattern
pattern.pattern = xlwt.Pattern.SOLID_PATTERN # May be: NO_PATTERN, SOLID_PATTERN, or 0x00 through 0x12
pattern.pattern_fore_colour = 0 # May be: 8 through 63. 0 = Black, 1 = White, 2 = Red, 3 = Green, 4 = Blue, 5 = Yellow, 6 = Magenta, 7 = Cyan, 16 = Maroon, 17 = Dark Green, 18 = Dark Blue, 19 = Dark Yellow , almost brown), 20 = Dark Magenta, 21 = Teal, 22 = Light Gray, 23 = Dark Gray, the list goes on...
style = xlwt.XFStyle() # Create the Pattern
style.pattern = pattern # Add Pattern to Style

with open("1和0的故事.txt", "r") as f:
    data = [list(i.strip()) for i in f.readlines()]
    flag = [
        [1, 1, 1, 1, 1, 1, 1],
        [1, 0, 0, 0, 0, 0, 1],
        [1, 0, 1, 1, 1, 0, 1],
        [1, 0, 1, 1, 1, 0, 1],
        [1, 0, 1, 1, 1, 0, 1],
        [1, 0, 0, 0, 0, 0, 1],
        [1, 1, 1, 1, 1, 1, 1]
    ]
    
    for i in range(len(data)):
        for j in range(len(data[1])):
            a=int(data[i][j])
            # 左上角定位标志
            if i < 7 and j < 7 and flag[i][j] ==1:
                worksheet.write(i,j,'',style)
            # 左下角定位标志
            elif i > 17 and j < 7 and flag[i-18][j] ==1:
                worksheet.write(i,j,'',style)
            # 右上角定位标志
            elif i < 7 and j > 17 and flag[i][j-18] ==1:
                worksheet.write(i,j,'',style)
            elif a==1:
                worksheet.write(i,j,'',style)
        worksheet.col(i).width = 500 #设置列宽(无法设置行高)

workbook.save('0和1的故事.xls')
  • 1
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值