menu FzWjScJの菜鸡记录
安恒七月赛——QRJoker
599 浏览 | 2020-07-25 | 阅读时间: 约 1 分钟 | 分类: CTF | 标签: misc,QRcode
请注意,本文编写于 90 天前,最后修改于 90 天前,其中某些信息可能已经过时。

QRJoker

Description

一个gif

Analyze

易得右边有不完整二维码,先分解,之前比赛手撸出来的,赛后写个脚本来一把梭一波

Solve

根据二维码的原理https://merricx.github.io/qrazybox/help/getting-started/about-qr-code.html,根据这个编写脚本,易得

from PIL import Image
from Crypto.Util import number
import base64

dic = {0:'0',1:'1',2:'2',3:'3',4:'4',5:'5',6:'6',7:'7',8:'8',9:'9',10:'A',11:'B',12:'C',13:'D',14:'E',15:'F',38:'%'}
res = ''
for num in range(64):
    p = Image.open('frame'+str(num+1)+'.bmp')
    a,b = p.size
    # print(a)
    data = []
    for y in range(100,b-10,10):
        d = []
        for x in range(410,470,10):
            if (y//10)%2 == 0:
                if p.getpixel((x,y)) >= 200:
                    d.append('1')
                else:
                    d.append('0')
            else:
                if p.getpixel((x,y)) >= 200:
                    d.append('0')
                else:
                    d.append('1')
        data.append(d)
    mode = data[11][5]+data[11][4]+data[10][5]+data[10][4]
    # print(mode)
    length = data[9][5]+data[9][4]+data[8][5]+data[8][4]+data[7][5]+data[7][4]+data[6][5]+data[6][4]+data[5][5]
    # print(length)
    d1 = data[5][4]+data[4][5]+data[4][4]+data[3][5]+data[3][4]+data[2][5]+data[2][4]
    d2 = data[1][5]+data[1][4]+data[0][5]+data[0][4]+data[0][3]+data[0][2]+data[1][3]+data[1][2]
    d3 = data[2][3]+data[2][2]+data[3][3]+data[3][2]+data[4][3]+data[4][2]+data[5][3]+data[5][2]
    d4 = data[6][3]+data[6][2]+data[7][3]+data[7][2]+data[8][3]+data[8][2]+data[9][3]+data[9][2]
    d5 = data[10][3]+data[10][2]+data[11][3]+data[11][2]+data[11][1]+data[11][0]+data[10][1]+data[10][0]
    d6 = data[9][1]+data[9][0]+data[8][1]+data[8][0]+data[7][1]+data[7][0]+data[6][1]+data[6][0]+data[5][1]
    d = d1+d2+d3+d4+d5+d6
    fin = d[:33]
    for i in range(0,len(fin),11):
        y = int(fin[i:i+11],2)%45
        x = int(fin[i:i+11],2)//45
        res += dic[x] + dic[y]
b64_data = number.long_to_bytes(int(res.replace('%',''),16))
while 1:
    b64_data = base64.b64decode(b64_data)
    if b'flag' in b64_data:
        print(b64_data)
        break

flag

flag{d69ede918ec3997989a5e8f8c703a729}

发表评论

email
web

全部评论 (共 11 条评论)

    bbb
    2020-08-01 22:50
    拿着脚本跑了一下,好像缺少18和36的对应字符?
      2020-08-03 12:40
      @bbb应该不会有18的数据啊,,,不清楚您那是为什么不对
        bbb
        2020-08-03 22:16
        @FzWjScJpython2环境下运行结果报错:Traceback (most recent call last):
        File "exp.py", line 41, in <module>res += dic[x] + dic[y]KeyError: 18大佬有空看看这是什么原因?
          2020-08-04 19:28
          @bbb因为脚本是python3的。
          aaa
          2020-08-03 22:29
          @bbb('QrJoker.gif.ifl\IMG00000.bmp', 'size:', 480, 230)
          ('d=', '011001100111100110011001100110011000011001100110')I9
          I9 I我给字典补齐了,就这个结果
    aaa
    2020-07-26 12:46
    大佬,这个脚本跑的时候出错,不是贴错了吧
      2020-07-26 18:27
      @aaagif分解的脚本没有贴,这个是分解后的操作,直接拿gif肯定不对,我的各个图片名称为framexx.bmp,看一下是不是里文件的原因,或者是你的第三方库不全,脚本应该没有问题
        aaa
        2020-08-03 22:16
        @FzWjScJ大佬把gif分解的图片贴下吧,我的跟bbb的错是一样的,难道是gif分解的时候有问题?
          2020-08-04 19:37
          @aaa放在这了 http ://www.fzwjscj.xyz/usr/uploads/pccode.zip
            aaa
            2020-08-05 22:53
            @FzWjScJ成功了,谢谢,我弄得jpg不行
      2020-07-26 18:19
      @aaa看了下好像没有贴错啊,是报的什么错