selph
selph
发布于 2024-05-17 / 67 阅读
0
0

[TBTL CTF 2024] re - Floopowder(Frida Hook 巧解算法问题)

analysis

分析的时候先别陷入细节,先看整体逻辑:

__int64 __fastcall main(int a1, char **a2, char **a3)
{
  int i; // [rsp+0h] [rbp-20h]
  int j; // [rsp+4h] [rbp-1Ch]
  int line; // [rsp+8h] [rbp-18h]
  int column; // [rsp+Ch] [rbp-14h]
  unsigned int v8; // [rsp+10h] [rbp-10h]
  int v9; // [rsp+14h] [rbp-Ch]
  int v10; // [rsp+18h] [rbp-8h]
  int v11; // [rsp+1Ch] [rbp-4h]

  puts("Now don't forget to speak very, very clearly...");
  for ( i = 0; i < 31; ++i )                    // 32次输入
  {
    __isoc99_scanf("%s", &input[31 * i]);       // 每次输入 31 字节
                                                // 是矩阵
    if ( strlen(&input[31 * i]) != 31 )
      error_exit();
    for ( j = 0; j < 31; ++j )
    {
      if ( input[31 * i + j] != '1' && input[31 * i + j] != '0' )// 数字必须是0和1中的一个
        error_exit();
    }
  }
  line = 0;
  column = 0;
  v8 = 0;
  v9 = 1;
  while ( line < 31 && column < 31 )            // 31*31矩阵
  {
    sub_11CA(line, column, v8++);               // 需要知道校验顺序
    if ( v9 == 1 )
    {
      v10 = line - 1;
      v11 = column + 1;
    }
    else
    {
      v10 = line + 1;
      v11 = column - 1;
    }
    if ( v10 < 0 || v10 == 31 || v11 < 0 || v11 == 31 )// 边界条件
    {
      if ( v9 == 1 )
      {
        line += column == 30;                   // line+0或者+1
        column += column < 30;                  // column+1或者+0
      }
      else
      {
        column += line == 30;
        line += line < 30;
      }
      v9 = 1 - v9;
    }
    else
    {
      line = v10;
      column = v11;
    }
  }
  puts("Welcome to Diagon Alley!");
  return 0LL;
}

程序接收输入31次,每次接收31字符,是个正方形矩阵,接收完输入会进入到sub_11CA函数进行处理:

_BOOL8 __fastcall sub_11CA(int line, int colunm, int idx)
{
  _BOOL8 result; // rax

  result = input[31 * line + colunm] == '1';
  if ( (input[31 * line + colunm] == '1') != (((dword_4020[idx / 31] >> (31 - idx % 31 - 1)) & 1) != 0) )// 两边条件同时满足
    error_exit();
  return result;
}

这里进行校验,如果校验不通过,就退出程序

那么求解思路就是:

  1. 分析校验的值
  2. 分析校验的顺序
  3. 还原矩阵的值

这里分析一下这个判断:

 (input[31 * line + colunm] == '1') != (((dword_4020[idx / 31] >> (31 - idx % 31 - 1)) & 1) != 0) 

(输入 == 1) != (一个值 & 1 !=0),简化一下:(输入 == 1) != (一个值 == 1)

也就是说,左边为1,右边算出来的值也需要为1

左边为0,右边算出来的值为0,第一步分析就完成了

接下来第二步,分析校验的顺序:矩阵这么多位,又不是一个一个按顺序校验,是按照某个算法逻辑进行的

常规思路是:去分析代码,手动分析校验顺序,然后写脚本还原矩阵;这里用一个取巧的思路:Hook 大法

这里我们看反汇编:

.text:0000000000001266                 cmp     eax, [rbp+var_4] ; 判断两个值是否相同
.text:0000000000001269                 jz      short loc_1275
.text:000000000000126B                 mov     eax, 0          ; 不同就设置eax为0
.text:0000000000001270                 call    error_exit
.text:0000000000001275 ; ---------------------------------------------------------------------------
.text:0000000000001275
.text:0000000000001275 loc_1275:                               ; CODE XREF: sub_11CA+9F↑j
.text:0000000000001275                 nop
.text:0000000000001276                 leave
.text:0000000000001277                 retn
.text:0000000000001277 ; } // starts at 11CA
.text:0000000000001277 sub_11CA        endp

这里可以进行patch,把call给patch掉:

.text:0000000000001266                 cmp     eax, [rbp+var_4]
.text:0000000000001269                 jz      short loc_1275
.text:000000000000126B                 mov     eax, 0
.text:0000000000001270                 nop
.text:0000000000001271                 nop
.text:0000000000001272                 nop
.text:0000000000001273                 nop
.text:0000000000001274                 nop
.text:0000000000001275
.text:0000000000001275 loc_1275:                               ; CODE XREF: sub_11CA+9F↑j
.text:0000000000001275                 nop
.text:0000000000001276                 leave
.text:0000000000001277                 retn
.text:0000000000001277 ; } // starts at 11CA
.text:0000000000001277 sub_11CA        endp
.text:0000000000001277

这样一来,这个函数会被一直执行,每次执行的前两个参数,就是目标值所在的行和列,而这里的eax,也就是返回值,也会根据判断结果而变化:

  • 如果输入是1,目标值是1,则返回1,
  • 如果输入是0,目标值是1,则返回0,
  • 如果输入是1,目标值是0,则返回0,
  • 如果输入是0,目标值是0,则返回1,

输入是可控的,如果我们输入的是全1,则只有两种情况:

  • 如果输入是1,目标值是1,则返回1,
  • 如果输入是1,目标值是0,则返回0,

返回值就是答案,参数决定输入所在的位置

exp:

写frida脚本进行Hook,拿到参数和返回值进行拼接字符串,变成python的数组赋值脚本:

const module = Process.getModuleByName("FlooPowder2");
const baseAddr = module.base;
const targetFuncOffset = 0x11ca;
const targetFuncAddr = baseAddr.add(targetFuncOffset);
var inp = ""
Interceptor.attach(targetFuncAddr, {
  onEnter: function(args) {
    //console.log("line: " +args[0].toInt32() + " col: " + args[1].toInt32() + " idx: " + args[2].toInt32());
    inp = "inp[" + args[0].toInt32() + "][" + args[1].toInt32() + "]"
  },
  onLeave: function(retval) {
    console.log(inp +"="+ retval.toInt32());
  }
});
from __future__ import print_function
import frida
import sys
from pwn import *

path = "FlooPowder2"
io = process(path)

#device = frida.get_device_manager().enumerate_devices()
local = frida.get_local_device()
a = local.get_process(path)
print(a)
session = local.attach(path)

with open("hook.js", "r") as f:
    code = f.read()

script = session.create_script(code)
script.load()

test_inp = """
1111111111111111111111111111111
1111111111111111111111111111111
1111111111111111111111111111111
1111111111111111111111111111111
1111111111111111111111111111111
1111111111111111111111111111111
1111111111111111111111111111111
1111111111111111111111111111111
1111111111111111111111111111111
1111111111111111111111111111111
1111111111111111111111111111111
1111111111111111111111111111111
1111111111111111111111111111111
1111111111111111111111111111111
1111111111111111111111111111111
1111111111111111111111111111111
1111111111111111111111111111111
1111111111111111111111111111111
1111111111111111111111111111111
1111111111111111111111111111111
1111111111111111111111111111111
1111111111111111111111111111111
1111111111111111111111111111111
1111111111111111111111111111111
1111111111111111111111111111111
1111111111111111111111111111111
1111111111111111111111111111111
1111111111111111111111111111111
1111111111111111111111111111111
1111111111111111111111111111111
1111111111111111111111111111111
"""

io.recvuntil(b"Now don't forget to speak very, very clearly...")
io.send(test_inp.encode())
io.interactive()

拿到超级长的输出,黏贴到python里,自己申请一个二维数组,开始赋值:

from PIL import Image
import zlib
# 二维数组30*30
inp = [[0 for i in range(32)] for j in range(32)]

inp[0][0]=0
inp[0][1]=0
inp[1][0]=0
inp[2][0]=0
inp[1][1]=1
inp[0][2]=0
inp[0][3]=0
inp[1][2]=1
inp[2][1]=1
inp[3][0]=0
inp[4][0]=0
inp[3][1]=1
inp[2][2]=0
inp[1][3]=1
inp[0][4]=0
inp[0][5]=0
inp[1][4]=1
inp[2][3]=0
inp[3][2]=0
inp[4][1]=1
inp[5][0]=0
inp[6][0]=0
inp[5][1]=1
inp[4][2]=0
inp[3][3]=1
inp[2][4]=0
inp[1][5]=1
inp[0][6]=0
inp[0][7]=0
inp[1][6]=1
inp[2][5]=0
inp[3][4]=1
inp[4][3]=1
inp[5][2]=0
inp[6][1]=1
inp[7][0]=0
inp[8][0]=0
inp[7][1]=1
inp[6][2]=0
inp[5][3]=1
inp[4][4]=1
inp[3][5]=1
inp[2][6]=0
inp[1][7]=1
inp[0][8]=0
inp[0][9]=0
inp[1][8]=0
inp[2][7]=1
inp[3][6]=0
inp[4][5]=1
inp[5][4]=1
inp[6][3]=0
inp[7][2]=1
inp[8][1]=0
inp[9][0]=0
inp[10][0]=0
inp[9][1]=1
inp[8][2]=0
inp[7][3]=1
inp[6][4]=0
inp[5][5]=1
inp[4][6]=0
inp[3][7]=1
inp[2][8]=0
inp[1][9]=0
inp[0][10]=0
inp[0][11]=0
inp[1][10]=1
inp[2][9]=1
inp[3][8]=0
inp[4][7]=1
inp[5][6]=0
inp[6][5]=0
inp[7][4]=1
inp[8][3]=0
inp[9][2]=1
inp[10][1]=0
inp[11][0]=0
inp[12][0]=0
inp[11][1]=1
inp[10][2]=0
inp[9][3]=1
inp[8][4]=0
inp[7][5]=1
inp[6][6]=0
inp[5][7]=1
inp[4][8]=0
inp[3][9]=0
inp[2][10]=1
inp[1][11]=0
inp[0][12]=0
inp[0][13]=0
inp[1][12]=0
inp[2][11]=0
inp[3][10]=1
inp[4][9]=1
inp[5][8]=0
inp[6][7]=1
inp[7][6]=1
inp[8][5]=0
inp[9][4]=1
inp[10][3]=1
inp[11][2]=0
inp[12][1]=1
inp[13][0]=0
inp[14][0]=0
inp[13][1]=0
inp[12][2]=0
inp[11][3]=1
inp[10][4]=0
inp[9][5]=1
inp[8][6]=0
inp[7][7]=1
inp[6][8]=0
inp[5][9]=0
inp[4][10]=1
inp[3][11]=1
inp[2][12]=1
inp[1][13]=0
inp[0][14]=0
inp[0][15]=0
inp[1][14]=1
inp[2][13]=1
inp[3][12]=1
inp[4][11]=0
inp[5][10]=0
inp[6][9]=1
inp[7][8]=0
inp[8][7]=0
inp[9][6]=0
inp[10][5]=0
inp[11][4]=0
inp[12][3]=0
inp[13][2]=0
inp[14][1]=0
inp[15][0]=0
inp[16][0]=0
inp[15][1]=1
inp[14][2]=0
inp[13][3]=1
inp[12][4]=1
inp[11][5]=0
inp[10][6]=1
inp[9][7]=1
inp[8][8]=0
inp[7][9]=1
inp[6][10]=0
inp[5][11]=1
inp[4][12]=1
inp[3][13]=0
inp[2][14]=0
inp[1][15]=1
inp[0][16]=0
inp[0][17]=0
inp[1][16]=0
inp[2][15]=0
inp[3][14]=0
inp[4][13]=0
inp[5][12]=0
inp[6][11]=1
inp[7][10]=0
inp[8][9]=0
inp[9][8]=1
inp[10][7]=0
inp[11][6]=0
inp[12][5]=1
inp[13][4]=0
inp[14][3]=0
inp[15][2]=1
inp[16][1]=1
inp[17][0]=0
inp[18][0]=0
inp[17][1]=1
inp[16][2]=1
inp[15][3]=1
inp[14][4]=0
inp[13][5]=1
inp[12][6]=0
inp[11][7]=1
inp[10][8]=1
inp[9][9]=1
inp[8][10]=0
inp[7][11]=1
inp[6][12]=0
inp[5][13]=1
inp[4][14]=1
inp[3][15]=1
inp[2][16]=1
inp[1][17]=1
inp[0][18]=0
inp[0][19]=0
inp[1][18]=0
inp[2][17]=1
inp[3][16]=1
inp[4][15]=0
inp[5][14]=1
inp[6][13]=0
inp[7][12]=0
inp[8][11]=0
inp[9][10]=1
inp[10][9]=0
inp[11][8]=1
inp[12][7]=0
inp[13][6]=0
inp[14][5]=1
inp[15][4]=0
inp[16][3]=1
inp[17][2]=0
inp[18][1]=1
inp[19][0]=0
inp[20][0]=0
inp[19][1]=1
inp[18][2]=0
inp[17][3]=0
inp[16][4]=1
inp[15][5]=0
inp[14][6]=1
inp[13][7]=1
inp[12][8]=1
inp[11][9]=0
inp[10][10]=1
inp[9][11]=1
inp[8][12]=0
inp[7][13]=1
inp[6][14]=1
inp[5][15]=0
inp[4][16]=1
inp[3][17]=0
inp[2][18]=1
inp[1][19]=0
inp[0][20]=0
inp[0][21]=0
inp[1][20]=1
inp[2][19]=1
inp[3][18]=0
inp[4][17]=1
inp[5][16]=0
inp[6][15]=1
inp[7][14]=0
inp[8][13]=1
inp[9][12]=0
inp[10][11]=0
inp[11][10]=1
inp[12][9]=1
inp[13][8]=0
inp[14][7]=0
inp[15][6]=0
inp[16][5]=1
inp[17][4]=1
inp[18][3]=1
inp[19][2]=0
inp[20][1]=1
inp[21][0]=0
inp[22][0]=0
inp[21][1]=1
inp[20][2]=0
inp[19][3]=0
inp[18][4]=1
inp[17][5]=0
inp[16][6]=0
inp[15][7]=1
inp[14][8]=0
inp[13][9]=1
inp[12][10]=1
inp[11][11]=0
inp[10][12]=0
inp[9][13]=1
inp[8][14]=0
inp[7][15]=1
inp[6][16]=1
inp[5][17]=0
inp[4][18]=1
inp[3][19]=0
inp[2][20]=0
inp[1][21]=0
inp[0][22]=0
inp[0][23]=0
inp[1][22]=0
inp[2][21]=0
inp[3][20]=0
inp[4][19]=1
inp[5][18]=0
inp[6][17]=0
inp[7][16]=0
inp[8][15]=0
inp[9][14]=1
inp[10][13]=0
inp[11][12]=1
inp[12][11]=1
inp[13][10]=1
inp[14][9]=1
inp[15][8]=0
inp[16][7]=0
inp[17][6]=1
inp[18][5]=0
inp[19][4]=0
inp[20][3]=1
inp[21][2]=0
inp[22][1]=0
inp[23][0]=0
inp[24][0]=0
inp[23][1]=1
inp[22][2]=0
inp[21][3]=0
inp[20][4]=1
inp[19][5]=1
inp[18][6]=1
inp[17][7]=1
inp[16][8]=0
inp[15][9]=0
inp[14][10]=1
inp[13][11]=0
inp[12][12]=1
inp[11][13]=1
inp[10][14]=1
inp[9][15]=0
inp[8][16]=1
inp[7][17]=1
inp[6][18]=0
inp[5][19]=0
inp[4][20]=0
inp[3][21]=1
inp[2][22]=0
inp[1][23]=1
inp[0][24]=0
inp[0][25]=0
inp[1][24]=1
inp[2][23]=1
inp[3][22]=0
inp[4][21]=0
inp[5][20]=0
inp[6][19]=0
inp[7][18]=0
inp[8][17]=1
inp[9][16]=0
inp[10][15]=0
inp[11][14]=1
inp[12][13]=0
inp[13][12]=1
inp[14][11]=1
inp[15][10]=1
inp[16][9]=1
inp[17][8]=1
inp[18][7]=0
inp[19][6]=1
inp[20][5]=0
inp[21][4]=1
inp[22][3]=0
inp[23][2]=1
inp[24][1]=1
inp[25][0]=0
inp[26][0]=0
inp[25][1]=1
inp[24][2]=0
inp[23][3]=1
inp[22][4]=0
inp[21][5]=0
inp[20][6]=0
inp[19][7]=1
inp[18][8]=0
inp[17][9]=1
inp[16][10]=0
inp[15][11]=0
inp[14][12]=0
inp[13][13]=0
inp[12][14]=0
inp[11][15]=1
inp[10][16]=0
inp[9][17]=0
inp[8][18]=0
inp[7][19]=1
inp[6][20]=0
inp[5][21]=1
inp[4][22]=0
inp[3][23]=1
inp[2][24]=0
inp[1][25]=1
inp[0][26]=0
inp[0][27]=0
inp[1][26]=1
inp[2][25]=0
inp[3][24]=0
inp[4][23]=1
inp[5][22]=0
inp[6][21]=1
inp[7][20]=0
inp[8][19]=1
inp[9][18]=1
inp[10][17]=1
inp[11][16]=1
inp[12][15]=0
inp[13][14]=1
inp[14][13]=1
inp[15][12]=0
inp[16][11]=1
inp[17][10]=0
inp[18][9]=0
inp[19][8]=0
inp[20][7]=0
inp[21][6]=0
inp[22][5]=0
inp[23][4]=1
inp[24][3]=0
inp[25][2]=0
inp[26][1]=1
inp[27][0]=0
inp[28][0]=0
inp[27][1]=1
inp[26][2]=0
inp[25][3]=1
inp[24][4]=0
inp[23][5]=1
inp[22][6]=0
inp[21][7]=1
inp[20][8]=1
inp[19][9]=0
inp[18][10]=1
inp[17][11]=0
inp[16][12]=0
inp[15][13]=0
inp[14][14]=1
inp[13][15]=0
inp[12][16]=1
inp[11][17]=1
inp[10][18]=0
inp[9][19]=0
inp[8][20]=1
inp[7][21]=1
inp[6][22]=0
inp[5][23]=1
inp[4][24]=0
inp[3][25]=1
inp[2][26]=0
inp[1][27]=1
inp[0][28]=0
inp[0][29]=0
inp[1][28]=1
inp[2][27]=0
inp[3][26]=1
inp[4][25]=1
inp[5][24]=0
inp[6][23]=1
inp[7][22]=0
inp[8][21]=1
inp[9][20]=1
inp[10][19]=0
inp[11][18]=1
inp[12][17]=0
inp[13][16]=1
inp[14][15]=0
inp[15][14]=1
inp[16][13]=1
inp[17][12]=0
inp[18][11]=0
inp[19][10]=0
inp[20][9]=1
inp[21][8]=0
inp[22][7]=0
inp[23][6]=1
inp[24][5]=0
inp[25][4]=1
inp[26][3]=1
inp[27][2]=0
inp[28][1]=1
inp[29][0]=0
inp[30][0]=0
inp[29][1]=1
inp[28][2]=0
inp[27][3]=1
inp[26][4]=1
inp[25][5]=1
inp[24][6]=0
inp[23][7]=1
inp[22][8]=0
inp[21][9]=0
inp[20][10]=0
inp[19][11]=1
inp[18][12]=0
inp[17][13]=1
inp[16][14]=0
inp[15][15]=1
inp[14][16]=0
inp[13][17]=0
inp[12][18]=0
inp[11][19]=1
inp[10][20]=0
inp[9][21]=1
inp[8][22]=0
inp[7][23]=1
inp[6][24]=0
inp[5][25]=1
inp[4][26]=1
inp[3][27]=1
inp[2][28]=0
inp[1][29]=1
inp[0][30]=0
inp[1][30]=0
inp[2][29]=1
inp[3][28]=0
inp[4][27]=1
inp[5][26]=1
inp[6][25]=0
inp[7][24]=1
inp[8][23]=0
inp[9][22]=1
inp[10][21]=1
inp[11][20]=0
inp[12][19]=1
inp[13][18]=1
inp[14][17]=1
inp[15][16]=1
inp[16][15]=0
inp[17][14]=1
inp[18][13]=0
inp[19][12]=1
inp[20][11]=1
inp[21][10]=1
inp[22][9]=1
inp[23][8]=0
inp[24][7]=1
inp[25][6]=0
inp[26][5]=1
inp[27][4]=1
inp[28][3]=0
inp[29][2]=1
inp[30][1]=0
inp[30][2]=0
inp[29][3]=1
inp[28][4]=0
inp[27][5]=1
inp[26][6]=0
inp[25][7]=1
inp[24][8]=0
inp[23][9]=1
inp[22][10]=0
inp[21][11]=1
inp[20][12]=1
inp[19][13]=1
inp[18][14]=1
inp[17][15]=1
inp[16][16]=0
inp[15][17]=0
inp[14][18]=1
inp[13][19]=1
inp[12][20]=0
inp[11][21]=1
inp[10][22]=1
inp[9][23]=0
inp[8][24]=0
inp[7][25]=1
inp[6][26]=0
inp[5][27]=1
inp[4][28]=0
inp[3][29]=1
inp[2][30]=0
inp[3][30]=0
inp[4][29]=1
inp[5][28]=0
inp[6][27]=0
inp[7][26]=1
inp[8][25]=0
inp[9][24]=1
inp[10][23]=1
inp[11][22]=0
inp[12][21]=0
inp[13][20]=1
inp[14][19]=0
inp[15][18]=1
inp[16][17]=1
inp[17][16]=0
inp[18][15]=1
inp[19][14]=0
inp[20][13]=0
inp[21][12]=1
inp[22][11]=1
inp[23][10]=1
inp[24][9]=0
inp[25][8]=0
inp[26][7]=1
inp[27][6]=0
inp[28][5]=0
inp[29][4]=1
inp[30][3]=0
inp[30][4]=0
inp[29][5]=1
inp[28][6]=0
inp[27][7]=1
inp[26][8]=0
inp[25][9]=1
inp[24][10]=0
inp[23][11]=0
inp[22][12]=0
inp[21][13]=0
inp[20][14]=0
inp[19][15]=1
inp[18][16]=0
inp[17][17]=0
inp[16][18]=0
inp[15][19]=0
inp[14][20]=0
inp[13][21]=1
inp[12][22]=1
inp[11][23]=0
inp[10][24]=1
inp[9][25]=0
inp[8][26]=0
inp[7][27]=1
inp[6][28]=0
inp[5][29]=1
inp[4][30]=0
inp[5][30]=0
inp[6][29]=1
inp[7][28]=1
inp[8][27]=0
inp[9][26]=1
inp[10][25]=1
inp[11][24]=1
inp[12][23]=0
inp[13][22]=0
inp[14][21]=1
inp[15][20]=0
inp[16][19]=0
inp[17][18]=0
inp[18][17]=1
inp[19][16]=1
inp[20][15]=1
inp[21][14]=0
inp[22][13]=1
inp[23][12]=0
inp[24][11]=0
inp[25][10]=0
inp[26][9]=1
inp[27][8]=0
inp[28][7]=1
inp[29][6]=1
inp[30][5]=0
inp[30][6]=0
inp[29][7]=1
inp[28][8]=0
inp[27][9]=1
inp[26][10]=0
inp[25][11]=0
inp[24][12]=0
inp[23][13]=0
inp[22][14]=1
inp[21][15]=0
inp[20][16]=1
inp[19][17]=0
inp[18][18]=1
inp[17][19]=0
inp[16][20]=0
inp[15][21]=1
inp[14][22]=0
inp[13][23]=0
inp[12][24]=0
inp[11][25]=1
inp[10][26]=1
inp[9][27]=0
inp[8][28]=0
inp[7][29]=1
inp[6][30]=0
inp[7][30]=0
inp[8][29]=0
inp[9][28]=1
inp[10][27]=1
inp[11][26]=0
inp[12][25]=1
inp[13][24]=1
inp[14][23]=0
inp[15][22]=0
inp[16][21]=0
inp[17][20]=0
inp[18][19]=0
inp[19][18]=1
inp[20][17]=0
inp[21][16]=1
inp[22][15]=0
inp[23][14]=1
inp[24][13]=1
inp[25][12]=0
inp[26][11]=0
inp[27][10]=1
inp[28][9]=1
inp[29][8]=0
inp[30][7]=0
inp[30][8]=0
inp[29][9]=1
inp[28][10]=1
inp[27][11]=1
inp[26][12]=0
inp[25][13]=1
inp[24][14]=1
inp[23][15]=1
inp[22][16]=0
inp[21][17]=1
inp[20][18]=0
inp[19][19]=0
inp[18][20]=1
inp[17][21]=0
inp[16][22]=0
inp[15][23]=1
inp[14][24]=0
inp[13][25]=0
inp[12][26]=1
inp[11][27]=0
inp[10][28]=1
inp[9][29]=0
inp[8][30]=0
inp[9][30]=0
inp[10][29]=0
inp[11][28]=0
inp[12][27]=0
inp[13][26]=1
inp[14][25]=1
inp[15][24]=0
inp[16][23]=1
inp[17][22]=0
inp[18][21]=1
inp[19][20]=0
inp[20][19]=0
inp[21][18]=0
inp[22][17]=0
inp[23][16]=1
inp[24][15]=0
inp[25][14]=0
inp[26][13]=0
inp[27][12]=1
inp[28][11]=0
inp[29][10]=1
inp[30][9]=0
inp[30][10]=0
inp[29][11]=1
inp[28][12]=1
inp[27][13]=1
inp[26][14]=0
inp[25][15]=1
inp[24][16]=0
inp[23][17]=1
inp[22][18]=0
inp[21][19]=0
inp[20][20]=0
inp[19][21]=1
inp[18][22]=1
inp[17][23]=0
inp[16][24]=1
inp[15][25]=1
inp[14][26]=0
inp[13][27]=1
inp[12][28]=1
inp[11][29]=0
inp[10][30]=0
inp[11][30]=0
inp[12][29]=0
inp[13][28]=0
inp[14][27]=1
inp[15][26]=1
inp[16][25]=1
inp[17][24]=0
inp[18][23]=0
inp[19][22]=1
inp[20][21]=1
inp[21][20]=0
inp[22][19]=1
inp[23][18]=0
inp[24][17]=1
inp[25][16]=1
inp[26][15]=0
inp[27][14]=0
inp[28][13]=0
inp[29][12]=1
inp[30][11]=0
inp[30][12]=0
inp[29][13]=0
inp[28][14]=0
inp[27][15]=0
inp[26][16]=0
inp[25][17]=0
inp[24][18]=0
inp[23][19]=0
inp[22][20]=1
inp[21][21]=1
inp[20][22]=1
inp[19][23]=1
inp[18][24]=1
inp[17][25]=1
inp[16][26]=1
inp[15][27]=1
inp[14][28]=0
inp[13][29]=0
inp[12][30]=0
inp[13][30]=0
inp[14][29]=0
inp[15][28]=0
inp[16][27]=0
inp[17][26]=1
inp[18][25]=1
inp[19][24]=1
inp[20][23]=0
inp[21][22]=1
inp[22][21]=1
inp[23][20]=1
inp[24][19]=1
inp[25][18]=1
inp[26][17]=1
inp[27][16]=1
inp[28][15]=1
inp[29][14]=0
inp[30][13]=0
inp[30][14]=0
inp[29][15]=0
inp[28][16]=1
inp[27][17]=0
inp[26][18]=0
inp[25][19]=1
inp[24][20]=0
inp[23][21]=1
inp[22][22]=0
inp[21][23]=1
inp[20][24]=1
inp[19][25]=0
inp[18][26]=1
inp[17][27]=0
inp[16][28]=1
inp[15][29]=0
inp[14][30]=0
inp[15][30]=0
inp[16][29]=1
inp[17][28]=1
inp[18][27]=0
inp[19][26]=1
inp[20][25]=0
inp[21][24]=1
inp[22][23]=0
inp[23][22]=0
inp[24][21]=1
inp[25][20]=0
inp[26][19]=0
inp[27][18]=0
inp[28][17]=1
inp[29][16]=1
inp[30][15]=0
inp[30][16]=0
inp[29][17]=1
inp[28][18]=0
inp[27][19]=1
inp[26][20]=1
inp[25][21]=1
inp[24][22]=0
inp[23][23]=1
inp[22][24]=0
inp[21][25]=1
inp[20][26]=1
inp[19][27]=1
inp[18][28]=1
inp[17][29]=0
inp[16][30]=0
inp[17][30]=0
inp[18][29]=0
inp[19][28]=0
inp[20][27]=0
inp[21][26]=0
inp[22][25]=1
inp[23][24]=0
inp[24][23]=0
inp[25][22]=1
inp[26][21]=1
inp[27][20]=1
inp[28][19]=0
inp[29][18]=1
inp[30][17]=0
inp[30][18]=0
inp[29][19]=1
inp[28][20]=1
inp[27][21]=1
inp[26][22]=1
inp[25][23]=1
inp[24][24]=0
inp[23][25]=1
inp[22][26]=0
inp[21][27]=1
inp[20][28]=1
inp[19][29]=0
inp[18][30]=0
inp[19][30]=0
inp[20][29]=0
inp[21][28]=0
inp[22][27]=1
inp[23][26]=0
inp[24][25]=1
inp[25][24]=1
inp[26][23]=0
inp[27][22]=0
inp[28][21]=0
inp[29][20]=1
inp[30][19]=0
inp[30][20]=0
inp[29][21]=0
inp[28][22]=1
inp[27][23]=1
inp[26][24]=1
inp[25][25]=1
inp[24][26]=0
inp[23][27]=0
inp[22][28]=0
inp[21][29]=0
inp[20][30]=0
inp[21][30]=0
inp[22][29]=0
inp[23][28]=0
inp[24][27]=0
inp[25][26]=1
inp[26][25]=1
inp[27][24]=1
inp[28][23]=0
inp[29][22]=0
inp[30][21]=0
inp[30][22]=0
inp[29][23]=1
inp[28][24]=1
inp[27][25]=1
inp[26][26]=1
inp[25][27]=1
inp[24][28]=0
inp[23][29]=0
inp[22][30]=0
inp[23][30]=0
inp[24][29]=0
inp[25][28]=1
inp[26][27]=0
inp[27][26]=0
inp[28][25]=0
inp[29][24]=1
inp[30][23]=0
inp[30][24]=0
inp[29][25]=1
inp[28][26]=0
inp[27][27]=0
inp[26][28]=1
inp[25][29]=1
inp[24][30]=0
inp[25][30]=0
inp[26][29]=1
inp[27][28]=1
inp[28][27]=0
inp[29][26]=1
inp[30][25]=0
inp[30][26]=0
inp[29][27]=1
inp[28][28]=1
inp[27][29]=0
inp[26][30]=0
inp[27][30]=0
inp[28][29]=0
inp[29][28]=0
inp[30][27]=0
inp[30][28]=0
inp[29][29]=0
inp[28][30]=0
inp[29][30]=0
inp[30][29]=0
inp[30][30]=0

for i in range(0,31):
    for j in range(0,31):
        a = inp[i][j]
        print(a, end='')
#    print()

MAX = 31
pic = Image.new('RGB', (MAX, MAX))
str = "0000000000000000000000000000000011111110010001101001001111111001000001011011001111000100000100101110100111001100001010111010010111010110101011110001011101001011101000101100000010101110100100000101010011100001010000010011111110101010101010101111111000000000000001001101110000000000111110111110110001011101010100000100101010001001000111111110001010001101011111111010011000000100110011111000100100100110100000101010110101010111100101100000000110011101100110010001010000111000100100011101001010111000011111000101010001000001111011001001011110001110000000001101000101101000100011011011101110100010001110001110110100111101100001011000110110011000011010101000100100100111000110001111101000000000000101011000011100010100001111111011000111100110101000000100000100000110010101000100000010111010100010110110111111111001011101010000000100111011101100101110101111100100111011100100010000010110100111001010100010001111111011110001111100111110000000000000000000000000000000000"
i=0
for y in range(0,MAX):
    for x in range(0,MAX):
        if(str[i] == '1'):
            pic.putpixel([x,y],(0,0,0))
        else:pic.putpixel([x,y],(255,255,255))
        i = i+1
pic.show()

这里最终拿到的矩阵结果,打印出来张这个样:(1显示,0不显示)

 ■■■■■■■  ■   ■■ ■  ■  ■■■■■■■
 ■     ■ ■■ ■■  ■■■■   ■     ■
 ■ ■■■ ■  ■■■  ■■    ■ ■ ■■■ ■
 ■ ■■■ ■ ■■ ■ ■ ■■■■   ■ ■■■ ■
 ■ ■■■ ■   ■ ■■      ■ ■ ■■■ ■
 ■     ■ ■ ■  ■■■    ■ ■     ■
 ■■■■■■■ ■ ■ ■ ■ ■ ■ ■ ■■■■■■■
             ■  ■■ ■■■
 ■■■■■ ■■■■■ ■■   ■ ■■■ ■ ■ ■
   ■  ■ ■ ■   ■  ■   ■■■■■■■■
 ■ ■   ■■ ■ ■■■■■■■■ ■  ■■
 ■  ■■  ■■■■■   ■  ■  ■  ■■ ■
   ■ ■ ■ ■■ ■ ■ ■ ■■■■  ■ ■■
     ■■  ■■■ ■■  ■■  ■   ■ ■
 ■■■   ■  ■   ■■■ ■  ■ ■ ■■■
 ■■■■■   ■ ■ ■   ■     ■■■■ ■■
 ■  ■ ■■■■   ■■■         ■■ ■
 ■ ■■ ■   ■   ■■ ■■ ■■■ ■■■ ■
 ■   ■■■   ■■■ ■■ ■  ■■■■ ■■
 ■ ■■   ■■ ■■  ■■    ■■ ■ ■ ■
 ■  ■  ■  ■■■   ■■   ■■■■■ ■
         ■ ■ ■■    ■■■   ■ ■
 ■■■■■■■ ■■   ■■■■  ■■ ■ ■
 ■     ■     ■■  ■ ■ ■   ■
 ■ ■■■ ■ ■   ■ ■■ ■■ ■■■■■■■■■
 ■ ■■■ ■ ■       ■  ■■■ ■■■ ■■
 ■ ■■■ ■ ■■■■■  ■  ■■■ ■■■  ■
 ■     ■ ■■ ■  ■■■  ■ ■ ■   ■
 ■■■■■■■ ■■■■   ■■■■■  ■■■■■

就是二维码呗,01字符串转二维码走起,扫码拿到flag:TBTL{Wh47_D1d_H3_5aY_D34r?_D14g0nal1y...}


评论