WriteUp 2024/7/26 re

signin

根据常量倒着推即可:

data = [0x10, 0x8, 0x15, 0x0a, 0x13, 4, 0x11, 0x3, 0x6, 0x5, 0x2b, 0x1d, 0x0d, 0x1e, 0x11, 0x1d, 0x1b, 0x0f, 0x9, 0x6f]
ikun = "ikun\x00"
s = [""] * 20
for i in range(20):
    s[i] = chr((data[i] - 1) ^ ord(ikun[i % 4]))
    print(chr(int(s[i])),end="")

flag{hello_reverse}

maze

__int64 __fastcall main(int a1, char **a2, char **a3)
{
  int step; // eax
  int n; // [rsp+8h] [rbp-78h]
  int dir; // [rsp+Ch] [rbp-74h]
  __int64 way[12]; // [rsp+10h] [rbp-70h] BYREF
  int v8; // [rsp+70h] [rbp-10h]
  char v9; // [rsp+74h] [rbp-Ch]
  unsigned __int64 v10; // [rsp+78h] [rbp-8h]

  v10 = __readfsqword(0x28u);
  memset(way, 0, sizeof(way));
  v8 = 0;
  v9 = 0;
  n = 0;
  puts("Welcome to my game!");
  puts("I'll give my flag if you win the game.");
  __isoc99_scanf("%100s", way);
  do
  {
    step = n++;
    dir = *((char *)way + step);
    if ( !*((_BYTE *)way + step) )
      break;
    maze[24 * y + x] = '4';
    if ( dir == 'w' )
    {
      --y;
    }
    else
    {
      if ( dir > 'w' )
        break;
      if ( dir == 's' )
      {
        ++y;
      }
      else
      {
        if ( dir > 's' )
          break;
        if ( dir == 'a' )
        {
          --x;
        }
        else
        {
          if ( dir != 'd' )
            break;
          ++x;
        }
      }
    }
    x += x < 0 ? 24 : 0;
    if ( x > 23 )
      x = 24 - x;
    y += y < 0 ? 9 : 0;
    if ( y > 8 )
      y = 9 - y;
    if ( maze[24 * y + x] == '3' )
    {
      printf("You win! flag is flag{%s}.\n", (const char *)way);
      return 0LL;
    }
  }
  while ( maze[24 * y + x] == '2' );
  puts("You failed...");
  return 0LL;
}

观察题目,得知是一个迷宫,只能走2,并且走到边界会自动走到另一边,不能走回头路。初始在(1,1),需要走到3的位置。

迷宫是:

111111111112121121112121
222212222212221222212221
111211112212121212111112
222222222211111112222122
111111121212222211112111
221222221112111222212222
121211111212121111211111
122222222212122221222131
121111111112121121112121

手动推理得到最后得到flag

Welcome to my game!
I'll give my flag if you win the game.
ddssddddssaaaassaawwaaaaawwaaawwawwwaaasssaawwwwwwddddsdddssddsssddwww
You win! flag is flag{ddssddddssaaaassaawwaaaaawwaaawwawwwaaasssaawwwwwwddddsdddssddsssddwww}.

puzzle

简单看了下代码发现是9*9的数独,初始数独是

000307000
060000020
100500000
305000400
000080060
000000000
020006000
000400500
000010300

找了个网站解决数独,得到

发现输入的时候是数字的ASCII+49变成字母,最后得到flag:

Please input your solve:cijdghbfefgeijbhcdbdhfcegijdjfghcebihecbidjgfibgjefcdhjcdhfgiebghbedifjceficbjdhg
You win! flag is flag{cijdghbfefgeijbhcdbdhfcegijdjfghcebihecbidjgfibgjefcdhjcdhfgiebghbedifjceficbjdhg}.
上一篇
下一篇