MoeCTF 2021Re部分------大佬请喝咖啡,A_game

大佬请喝咖啡

反编译

在这里插入图片描述

解释\u:

就是一个数字编码,只不过它是两个字节,所以需要使用Unicode编码,ascii码只有一字节,没办法大于256(官方是128),所以这里的话,只需要把\u换成0x,即可和字符进行相乘

z3解码

from z3 import *
s=Solver()
charArray=[Int('a1[' + str(i) + ']') for i in range(9)]
for i in range(9):
    s.add(charArray[0] *4778 + charArray[1] * 3659 + charArray[2] * 9011 + charArray[3] * 5734 + charArray[4] * 4076 + charArray[5] * 6812 + charArray[6] * 8341 + charArray[7] * 6765 + charArray[8] * 7435 == 5711942)
    s.add(charArray[0] * 4449+ charArray[1] * 5454 + charArray[2] * 4459 + charArray[3] * 5800 + charArray[4] * 6685 + charArray[5] * 6120 + charArray[6] * 7357 + charArray[7] * 3561 + charArray[8] * 5199 == 4885863)
    s.add(charArray[0] * 3188 + charArray[1] * 6278 + charArray[2] * 9411 + charArray[3] * 5760 + charArray[4] * 9909 + charArray[5] * 7618 + charArray[6] * 7184 + charArray[7] * 4791 + charArray[8] * 0x21ee == 6387690)
    s.add(charArray[0] * 0x227b + charArray[1] * 0x1cfb + charArray[2] * 0x1b79 + charArray[3] * 0x245a + charArray[4] * 0x1c84 + charArray[5] * 0x168e + charArray[6] * 0x19bc + charArray[7] * 0x15a5 + charArray[8] * 0x1214 == 6077067)
    s.add(charArray[0] * 0x164b + charArray[1] * 0x16a1 + charArray[2] * 0x11ed + charArray[3] * 0x1a17 + charArray[4] * 0xf84 + charArray[5] * 0x16f4 + charArray[6] * 0x1a0c + charArray[7] * 0x173f + charArray[8] * 0x2561 == 5492294)
    s.add(charArray[0] * 0x25d5 + charArray[1] * 0x1cca + charArray[2] * 0x1228 + charArray[3] * 0x1c3e + charArray[4] * 0x258e + charArray[5] * 0x26fb + charArray[6] * 0x2075 + charArray[7] *0x259f + charArray[8] * 0x2438 == 7562511)
    s.add(charArray[0] * 0x1b2b + charArray[1] * 0x2177 + charArray[2] * 0x1f0d + charArray[3] * 0x21fb + charArray[4] * 0xcd4 + charArray[5] * 0x19f7 + charArray[6] * 0x0c67 + charArray[7] * 0x213a + charArray[8] * 0x1998 == 5970432)
    s.add(charArray[0] * 0x10e3 + charArray[1] * 0x1262 + charArray[2] * 0x1f91 + charArray[3] * 0x1edc + charArray[4] * 0x12fe + charArray[5] * 0x2548 + charArray[6] * 0x145b + charArray[7] * 0x1d13 + charArray[8] * 0x162c == 5834523)
    s.add(charArray[0] * 0x0bce + charArray[1] * 0x2327 + charArray[2] * 0x13c2 + charArray[3] * 0x11b1 + charArray[4] * 0xf64 + charArray[5] * 0x10b7 + charArray[6] * 0x11fe + charArray[7] * 0xd64 + charArray[8] * 0x22b9 == 4681110)
if s.check()==sat:
    print()
print(s.model())
moectf{EXcalibur}

A_game

数独题:

输入的东西进行数独阵填充:

unsigned char box[] =
{
    0,   0,   5,   0,   0,   4,   3,   6,   0,
	0,   0,   0,   0,   5,   0,   0,   2,   4,
	0,   4,   9,   6,   7,   0,   0,   0,   0,
	1,   0,   6,   0,   2,   0,   0,   3,   0,
	9,   0,   0,   7,   0,   0,   1,   0,   8,
	0,   3,   0,   0,   0,   5,   0,   9,   0,
	2,   0,   0,   5,   0,   7,   0,   0,   9,
	7,   0,   4,   0,   0,   0,   8,   0,   0
	0,   9,   0,   0,   4,   0,   0,   0,   6,
}

主要是三个函数:

这里判断行数据是1~9:

  for ( i = 0; i <= 8; ++i )
  {
    for ( j = 1; j <= 9; ++j )
    {
      for ( k = 0; ; ++k )
      {
        result = (unsigned int)(char)box[9 * i + k];// 这里判断行数据是1~9
        if ( j == (_DWORD)result )
          break;
        if ( k == 8 )
        {
          printf("Wrong!!!Try again!!!");
          system("pause");
          exit(0);
        }
      }
    }
  }

这里判断列数据是1~9:

 for ( i = 0; i <= 8; ++i )
  {
    for ( j = 1; j <= 9; ++j )
    {
      for ( k = 0; ; ++k )
      {
        result = (unsigned int)(char)box[9 * k + i];// 判断列数据是1~9
        if ( j == (_DWORD)result )
          break;
        if ( k == 8 )
        {
          printf("Wrong!!!Try again!!!");
          system("pause");
          exit(0);
        }
      }
    }
  }
  return result;
}

99数独阵分为9个33方阵,每个方阵数据1~9

 for ( i = 0; i <= 8; i += 3 )
  {
    for ( j = 0; j <= 8; j += 3 )
    {
      for ( k = 1; k <= 9; ++k )
      {
        v5 = 0;
        v4 = 0;
        while ( 1 )
        {
          result = (unsigned int)(char)box[9 * i + 9 * v5 + j + v4];// i代表行 j代表列
          if ( k == (_DWORD)result )
            break;
          if ( v5 == 2 && v4 == 2 )
          {
            printf("Wrong!!!Try again!!!");
            system("pause");
            exit(0);
          }
          if ( ++v4 == 3 )
          {
            ++v5;
            v4 = 0;
          }
        }
      }
    }
  }

进行异或magic

在这里插入图片描述

脚本

在线数独求解器

本人所做第一道数独题

a=b'8291767138932581849755263447186268341129653538127'
magic =[107,2,102,112,68,105,126,110,67,74,
  120,
  74,
  109,
  96,
  86,
  0,
  81,
  89,
  80,
  67,
  80,
  81,
  109,
  116,
  2,
  85,
  80,
  82,
  110,
  111,
  121,
  64,
  93,
  75,
  30,
  25,
  28,
  116,
  3,
  84,
  7,
  76,
  82,
  106,
  96,
  80,
  88,
  64,
  88,]


for i in range(len(a)):
    print(chr(a[i]^magic[i]),end='')
moectf{S0_As_I_prAy_Un1imited_B1ade_WOrks---E1m1ya_Shiro}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

寻梦&之璐

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值