吾爱破解 - LCG - LSG |安卓破解|病毒分析|www.52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 19081|回复: 24
收起左侧

[CTF] Hgame Ctf write up

  [复制链接]
姚小宝 发表于 2019-2-9 17:28
本帖最后由 yechen123 于 2019-2-9 20:11 编辑

题目    第二周.rar (26.02 KB, 下载次数: 33)


Hgame 第二周的逆向题
0x00 Pro的Python教室(二)
下载压缩包是一个pyc文件
直接用uncompyle6反编译成py文件
[Asm] 纯文本查看 复制代码
uncompyle6 -o secend.py secend.pyc

得到py代码
[Asm] 纯文本查看 复制代码
# uncompyle6 version 3.2.4
# Python bytecode 2.7 (62211)
# Decompiled from: Python 2.7.13 (v2.7.13:a06454b1afa1, Dec 17 2016, 20:53:40) [MSC v.1500 64 bit (AMD64)]
# Embedded file name: secend.py
# Compiled at: 2019-02-01 21:18:58
print "Welcome to Processor's Python Classroom Part 2!\n"
print "Now let's start the origin of Python!\n"
print 'Plz Input Your Flag:\n'
enc = raw_input()
len = len(enc)
enc1 = []
enc2 = ''
aaa = 'ioOavquaDb}x2ha4[~ifqZaujQ#'
for i in range(len):
    if i % 2 == 0:
        enc1.append(chr(ord(enc[i]) + 1))
    else:
        enc1.append(chr(ord(enc[i]) + 2))

s1 = []
for x in range(3):
    for i in range(len):
        if (i + x) % 3 == 0:
            s1.append(enc1[i])

enc2 = enc2.join(s1)
if enc2 in aaa:
    print "You 're Right!"
else:
    print "You're Wrong!"
    exit(0)

可以编写解密脚本
[Asm] 纯文本查看 复制代码
u ="ioOavquaDb}x2ha4[~ifqZaujQ#"
us = []
for i in u:
        us.append(i)
print us
q = []
for i in range(3):
        for x in range(27):
                if(i+x)%3==0:
                        q.append(x)
print q
for i in range(len(us)):
        us[q[i]] = u[i]

print us
flag = ""
for y in us:
        flag += y
print flag

flags = ""
for i in range(27):
    if i % 2 == 0:
        flags+=(chr(ord(flag[i]) - 1))
    else:
            flags+=(chr(ord(flag[i]) - 2))

print flags

得到flag
[Asm] 纯文本查看 复制代码
hgame{Now_Y0u_got_th3_PYC!}



0x01 maze

IDA打开
发现Check函数
[Asm] 纯文本查看 复制代码
_BOOL8 __fastcall Check(const char *a1)
{
  char v2; // [rsp+17h] [rbp-9h]
  int i; // [rsp+18h] [rbp-8h]
  int v4; // [rsp+1Ch] [rbp-4h]

  v4 = strlen(a1);
  for ( i = 0; i < v4; ++i )
  {
    v2 = Setmap(a1[i]);
    if ( !v2 )
      return 0LL;
    if ( v2 == 49 )
      return 0LL;
    if ( v2 > 49 )
    {
      if ( v2 != 115 )
      {
        if ( v2 == 116 )
          return v4 - 1 == i;
        return 0LL;
      }
    }
    else if ( v2 != 46 )
    {
      return 0LL;
    }
  }
  return 0LL;
}

再看看
Setmap函数
[Asm] 纯文本查看 复制代码
__int64 __fastcall Setmap(char a1)
{
  __int64 result; // rax
  char v2; // [rsp+30h] [rbp-480h]
  unsigned __int64 v3; // [rsp+4A8h] [rbp-8h]
  __int64 savedregs; // [rsp+4B0h] [rbp+0h]

  v3 = __readfsqword(0x28u);
  qmemcpy(
    &v2,
    "11111111111111111111111111111111111111111111111111111111111111111111...............111111111111111...............111"
    "111111111111.1111111111111.111111111111111.1111111111111.111111111111111.1111111111111.111111111111111.1111111111111"
    ".111111111111111.1111111111111.111111111111111.1111111111111.111111111111111.1111111111111s111111111111111.111111111"
    "1111s111111111111111.11111111111111111111111111111.11111111111111111111111111111.11111111111111111111111111111.11111"
    "111111111111111111111111.11111111111111111111111111111.1111.111111111111111111111111.1t............111111111111111.1"
    "t............111111111111111.1111111111111.111111111111111.1111111111111.111111111111111.1111111111111.1111111111111"
    "11.1111111111111.111111111111111.1111111111111.111111111111111.1111111111111.111111111111111.1111111111111.111111111"
    "111111.1111111111111.111111111111111.1111111111111.111111111111111.1111111111111.111111111111111.1111111111111.11111"
    "1111111111.1111111111111.111111111111111...............111111111111111...............1111111111111111111111111111111"
    "111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111",
    0x474uLL);
  if ( a1 == 100 )                              // d
  {
    if ( y_2973 > 17 )
      result = 0LL;
    else
      result = *((unsigned __int8 *)&savedregs + 60 * y_2973 + ++x_2974 - 1152);
  }
  else if ( a1 > 100 )
  {
    if ( a1 == 115 )                            // s
    {
      if ( x_2974 > 58 )
        result = 0LL;
      else
        result = *((unsigned __int8 *)&savedregs + 60 * ++y_2973 + x_2974 - 1152);
    }
    else
    {
      if ( a1 != 119 )                          // w
        return 0LL;
      if ( y_2973 <= 0 )
        result = 0LL;
      else
        result = *((unsigned __int8 *)&savedregs + 60 * --y_2973 + x_2974 - 1152);
    }
  }
  else
  {
    if ( a1 != 97 )                             // a
      return 0LL;
    if ( x_2974 <= 0 )
      result = 0LL;
    else
      result = *((unsigned __int8 *)&savedregs + 60 * y_2973 + --x_2974 - 1152);
  }
  return result;
}

可以看到一些奇怪的字符串  应该是迷宫题
对于迷宫题 得到迷宫 并且得到迷宫的行列大小 方向控制键 还有人物初始位置 就可以非常快解题了

从代码发现
[Asm] 纯文本查看 复制代码
result = *((unsigned __int8 *)&savedregs + 60 * y_2973 + ++x_2974 - 1152);

迷宫列数应该是60 方向控制键是asdw
可以得到迷宫
[Asm] 纯文本查看 复制代码
111111111111111111111111111111111111111111111111111111111111
11111111...............111111111111111...............1111111
11111111.1111111111111.111111111111111.1111111111111.1111111
11111111.1111111111111.111111111111111.1111111111111.1111111
11111111.1111111111111.111111111111111.1111111111111.1111111
11111111.1111111111111s111111111111111.1111111111111s1111111
11111111.11111111111111111111111111111.111111111111111111111
11111111.11111111111111111111111111111.111111111111111111111
11111111.11111111111111111111111111111.1111.1111111111111111
11111111.1t............111111111111111.1t............1111111
11111111.1111111111111.111111111111111.1111111111111.1111111
11111111.1111111111111.111111111111111.1111111111111.1111111
11111111.1111111111111.111111111111111.1111111111111.1111111
11111111.1111111111111.111111111111111.1111111111111.1111111
11111111.1111111111111.111111111111111.1111111111111.1111111
11111111.1111111111111.111111111111111.1111111111111.1111111
11111111...............111111111111111...............1111111
111111111111111111111111111111111111111111111111111111111111
111111111111111111111111111111111111111111111111111111111111

得到flag
[Asm] 纯文本查看 复制代码
wwwwaaaaaaaaaaaaaasssssssssssssssddddddddddddddwwwwwwwaaaaaaaaaaaa



0x02 ShinyShot!
IDA打开 发现
[Asm] 纯文本查看 复制代码
int __cdecl sub_4017AA(char a1)
{
  char *Str; // ST20C_4
  char *MaxCount; // [esp+210h] [ebp-204h]
  int DstBuf; // [esp+21Eh] [ebp-1F6h]
  __int16 v5; // [esp+222h] [ebp-1F2h]
  int v6; // [esp+24Ch] [ebp-1C8h]
  CHAR Filename; // [esp+250h] [ebp-1C4h]
  char Str1; // [esp+354h] [ebp-C0h]
  char Buf[60]; // [esp+3B8h] [ebp-5Ch]
  unsigned int cout; // [esp+3F4h] [ebp-20h]
  FILE *v11; // [esp+3F8h] [ebp-1Ch]
  char *v12; // [esp+408h] [ebp-Ch]

  v12 = &a1;
  sub_401EE0();
  puts("Sorroundings...Weird..");
  cout = 0;
  memset(Buf, 0, sizeof(Buf));
  memset(&Str1, 0, 0x64u);
  memset(&Filename, 0, 0x104u);
  DstBuf = 0;
  v6 = 0;
  memset(
    (void *)((unsigned int)&v5 & 0xFFFFFFFC),
    0,
    4 * (((unsigned int)((char *)&DstBuf - ((unsigned int)&v5 & 0xFFFFFFFC) + 50) & 0xFFFFFFFC) >> 2));
  puts("I see!It's not my fault!Wrong is the world!");
  puts("So..Now I should give a shot to fix it!");
  scanf("%u", &cout);
  if ( cout > 0x20000 )
    sub_40178C();
  getchar();
  sub_401460(cout);
  puts("And then,a shiny explosion!");
  fgets(Buf, 59, iob[0]);
  Buf[strlen(Buf) - 1] = 0;
  if ( strlen(Buf) != 22 )
    sub_40178C();
  puts("Seems I have passed a test.");
  sub_4014FA(Str, MaxCount);
  GetModuleFileNameA(0, &Filename, 0x104u);
  v11 = fopen(&Filename, "rb");
  fseek(v11, -32, 2);
  fread(&DstBuf, 0x20u, 1u, v11);
  fclose(v11);
  if ( !strcmp(&Str1, (const char *)&DstBuf) )
  {
    puts("Congratulations!");
    puts("The flag is hgame{your input string + your input num}");
    puts("e.g:hgame{aaaaaaaaaa111}");
  }
  else
  {
    printf("But Failed..Finally");
  }
  return 0;
}

代码有些问题

先输入一个数字 然后传进 sub_401460函数
[Asm] 纯文本查看 复制代码
BOOL __cdecl sub_401460(unsigned int cout)
{
  DWORD flOldProtect; // [esp+14h] [ebp-14h]
  unsigned int v3; // [esp+18h] [ebp-10h]
  unsigned int v4; // [esp+1Ch] [ebp-Ch]

  flOldProtect = 0;
  VirtualProtect(TopLevelExceptionFilter, 0x4000u, 0x40u, &flOldProtect);
  v4 = cout >> 3;
  v3 = cout & 7;
  *((_BYTE *)TopLevelExceptionFilter + (cout >> 3)) ^= 1 << (cout & 7);
  return VirtualProtect(TopLevelExceptionFilter, 0x4000u, flOldProtect, &flOldProtect);
}

发现函数里边改写了页属性 而且 我们输入的数字 后边3位可以与选中的地址异或 剩下的几位可以作为地址偏移
地址基址是TopLevelExceptionFilter  也就是401000
查看反汇编  看看代码哪里错了
可以看到 在调用sub_4014FA函数的时候应该压入栈的参数没有入栈

[Asm] 纯文本查看 复制代码
.text:004018DE EB 15             jmp     short loc_4018F5
.text:004018E0                   ; ---------------------------------------------------------------------------
.text:004018E0
.text:004018E0                   loc_4018E0:                   ; CODE XREF: sub_4017AA+126↑j
.text:004018E0 E8 A7 FE FF FF    call    sub_40178C
.text:004018E5                   ; ---------------------------------------------------------------------------
.text:004018E5
.text:004018E5                   loc_4018E5:
.text:004018E5 8D 85 40 FF FF FF lea     eax, [ebp-0C0h]
.text:004018EB 89 44 24 04       mov     [esp+414h+var_410], eax ; char *
.text:004018EF 8D 45 A4          lea     eax, [ebp+Buf]
.text:004018F2 89 04 24          mov     [esp+414h+var_414], eax ; char *
.text:004018F5
.text:004018F5                   loc_4018F5:                   ; CODE XREF: sub_4017AA+134↑j
.text:004018F5 E8 00 FC FF FF    call    sub_4014FA

也就是             jmp     short loc_4018F5 本来应该跳到                  loc_4018E5的 它却跳到了loc_4018F5
jmp     short loc_4018F5 的机器码是EB 15 EB表示jmp 15表示偏移
也就是
[Asm] 纯文本查看 复制代码
0x15 = 0x4018F5 - 0x4018DE - jmp指令长度(2字节)

我们要跳到                 loc_4018E5 也就是

[Asm] 纯文本查看 复制代码
0x5 = 0x4018e5-0x4018de-0x2

所以 输入数字最低三位应该等于四  也就是100

而要修改的字节的地址是0x4018DF 所以 除了前面几位应该是0x8DF
也就是 (0x8df<<3) + 0x4 = 18172

再看sub_4014FA函数
[Asm] 纯文本查看 复制代码
size_t __cdecl sub_4014FA(char *Str, char *a2)
{
  int v2; // eax
  int v3; // ebx
  int v4; // eax
  int v5; // ebx
  int v6; // eax
  char v7; // al
  size_t result; // eax
  signed int v9; // [esp+10h] [ebp-18h]
  size_t v10; // [esp+10h] [ebp-18h]
  int j; // [esp+14h] [ebp-14h]
  signed int i; // [esp+18h] [ebp-10h]
  int v13; // [esp+1Ch] [ebp-Ch]

  v13 = 0;
  v9 = 4 * strlen(Str) / 3;
  for ( i = 0; i < v9; ++i )
  {
    if ( i & 3 )
    {
      if ( i % 4 == 1 )
      {
        v3 = 16 * Str[v13 - 1] & 0x30;
        v4 = v13++;
        a2[i] = byte_405020[v3 | (char)(Str[v4] >> 4)];
      }
      else
      {
        if ( i % 4 == 2 )
        {
          v5 = 4 * Str[v13 - 1] & 0x3C;
          v6 = v13++;
          v7 = byte_405020[v5 | (char)(Str[v6] >> 6)];
        }
        else
        {
          v7 = byte_405020[Str[v13 - 1] & 0x3F];
        }
        a2[i] = v7;
      }
    }
    else
    {
      v2 = v13++;
      a2[i] = byte_405020[(char)(Str[v2] >> 2)];
    }
  }
  if ( strlen(Str) % 3 == 1 )
  {
    a2[v9] = byte_405020[16 * Str[v13 - 1] & 0x30];
    a2[v9 + 1] = 61;
    a2[v9 + 2] = 61;
  }
  else if ( strlen(Str) % 3 == 2 )
  {
    a2[v9] = byte_405020[4 * Str[v13 - 1] & 0x3C];
    a2[v9 + 1] = 61;
  }
  a2[strlen(a2)] = 0;
  v10 = strlen(a2);
  for ( j = 0; ; ++j )
  {
    result = v10 - 1;
    if ( (signed int)(v10 - 1) <= j )
      break;
    a2[j + 1] ^= a2[j];
  }
  return result;
}

是一个base64加密  不过字母表改变了 而且最后加多了一层异或
再看下边的函数
[Asm] 纯文本查看 复制代码
  GetModuleFileNameA(0, &Filename, 0x104u);
  v11 = fopen(&Filename, "rb");
  fseek(v11, -32, 2);
  fread(&DstBuf, 0x20u, 1u, v11);
  fclose(v11);

从文件最后32位抽出来跟加密后数据对比
把这32位异或得到
[Asm] 纯文本查看 复制代码
DnY0m19iAgArMKjSP2Uvme8wOzb0iD==

在经过base64解密  可以从网上套脚本 也可以自己写
[Asm] 纯文本查看 复制代码
#include <stdio.h>
#include <stdlib.h>
#include <windows.h>

int main(void)
//18172
{//, 'i', 'D', '=', '='
    char en_asc[32] = {'D', 'n', 'Y', '0', 'm', '1', '9', 'i', 'A', 'g', 'A', 'r', 'M', 'K', 'j', 'S', 'P', '2', 'U', 'v', 'm', 'e', '8', 'w', 'O', 'z', 'b', '0', 'i', 'D', '=', '='};
    char *asciis = "abcdefghijklmABCDEFGHIJKLMNOPQRSTUVWXYZnopqrstuvwxyz0123456789+/";
    UINT8 one,two,three;
    char cout1,cout2,cout3,cout4;

    for(int i=0; i<29; i+=4)
    {
        one = 0;
        two = 0;
        three = 0;
        for(cout1=0;;cout1++)
        {
            if(en_asc[i] == asciis[cout1])
                break;
        }
        for(cout2=0;;cout2++)
        {
            if(en_asc[i+1]==asciis[cout2])
                break;
        }
        for(cout3=0;;cout3++)
        {
            if(en_asc[i+2]==asciis[cout3])
                break;
        }
        for(cout4=0;;cout4++)
        {
            if(en_asc[i+3]==asciis[cout4])
                break;
        }
        //printf("%d %d %d %d \n",cout1,cout2,cout3,cout4);
        one = cout1<<2;
        one = (cout2 >>4) + one;
        two = cout2<<4;
        two = two + (cout3>>2);
        three  =cout3<<6;
        three = three + (cout4);
       printf("%c%c%c\n", one,two,three);
    }
    return 0;
}

得到

Byt3_H4cker_sho0O0o0t!



0x03 Pro的Python教室(三&四)


是一个pyc文件 但是用uncompyle6反编译失败

用winhex查看文件格式

1.png

发现前面的格式都没有错

而从第二行的0x73开始 一个字节表示0x73  后面4个字节标识长度。从0x71开始就是co_code内容了。

使用marshal查看一下哪里出错了

[Asm] 纯文本查看 复制代码
>>> import dis,marshal
>>> f = open("third.pyc", "rb")
>>> magic = f.read(4)
>>> mtime = f.read(4)
>>> dis.dis(marshal.load(f))
  2           0 JUMP_ABSOLUTE            3
        >>    3 JUMP_ABSOLUTE            9
              6 LOAD_CONST              15 ("You're Wrong! ")
        >>    9 JUMP_ABSOLUTE           14

  3          12 PRINT_ITEM
             13 LOAD_CONST             100
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "D:\python2.7\lib\dis.py", line 43, in dis
    disassemble(x)
  File "D:\python2.7\lib\dis.py", line 95, in disassemble
    print '(' + repr(co.co_consts[oparg]) + ')',
IndexError: tuple index out of range
>>>

发现应该是偏移为13的位置指令码出错了

2.png

估计是0x64太大了  可以改成0x48

后边想了一个下午也没能反编译成py文件 但是能dis出来指令了 只能硬看指令了

找不到好的解释文档 只能半猜半解

[Asm] 纯文本查看 复制代码
>>> dis.dis(marshal.load(f))
  2           0 JUMP_ABSOLUTE            3
        >>    3 JUMP_ABSOLUTE            9
              6 LOAD_CONST              15 ("You're Wrong! ")
        >>    9 JUMP_ABSOLUTE           14

  3          12 PRINT_ITEM
             13 PRINT_NEWLINE
        >>   14 LOAD_CONST               0 (-1)
             17 LOAD_CONST               1 (None)
             20 IMPORT_NAME              0 (string)
             23 STORE_NAME               0 (string)
             26 LOAD_NAME                1 (list)
             29 LOAD_NAME                0 (string)
             32 LOAD_ATTR                2 (letters)
             35 CALL_FUNCTION            1
             38 LOAD_NAME                1 (list)
             41 LOAD_NAME                0 (string)
             44 LOAD_ATTR                3 (digits)
             47 CALL_FUNCTION            1

  5          50 BINARY_ADD
             51 LOAD_CONST               2 ('+')
             54 LOAD_CONST               3 ('/')
             57 BUILD_LIST               2
             60 BINARY_ADD
             61 STORE_NAME               2 (letters)
             64 LOAD_CONST               4 ('FcjTCgD1EffEm2rPC3bTyL5Wu2bKBI9KAZrwFgrUygHN')
             67 STORE_NAME               4 (dec)

 35          70 LOAD_CONST               5 (<code object encode at 0000000002CAA7B0, file "third.py", line 7>)
             73 MAKE_FUNCTION            0
             76 STORE_NAME               5 (encode)
             79 LOAD_CONST               6 ("Welcome to Processor's Python Classroom Part 3&4!\n")
             82 PRINT_ITEM
             83 PRINT_NEWLINE
             84 LOAD_CONST               7 ('qi shi wo jiu shi lan cai ba liang dao ti fang zai yi qi.')
             87 PRINT_ITEM
             88 PRINT_NEWLINE
             89 LOAD_CONST               8 ("Now let's start the origin of Python!\n")
             92 PRINT_ITEM
             93 PRINT_NEWLINE

 40          94 LOAD_CONST               9 ('Plz Input Your Flag:\n')
             97 PRINT_ITEM
             98 PRINT_NEWLINE
             99 LOAD_NAME                6 (raw_input)
            102 CALL_FUNCTION            0
            105 STORE_NAME               7 (enc)
            108 LOAD_NAME                1 (list)
            111 LOAD_NAME                7 (enc)
            114 CALL_FUNCTION            1
            117 STORE_NAME               8 (lst)
            120 LOAD_NAME                8 (lst)
            123 LOAD_ATTR                9 (reverse)
            126 CALL_FUNCTION            0
            129 POP_TOP
            130 LOAD_NAME               10 (len)
            133 LOAD_NAME                8 (lst)
            136 CALL_FUNCTION            1
            139 STORE_NAME              11 (llen)
            142 SETUP_LOOP              99 (to 244)
            145 LOAD_NAME               12 (range)
            148 LOAD_NAME               11 (llen)
            151 CALL_FUNCTION            1
            154 GET_ITER
            155 FOR_ITER                85 (to 243)
            158 STORE_NAME              13 (i)
            161 LOAD_NAME               13 (i)
            164 LOAD_CONST              10 (2)
            167 BINARY_MODULO
            168 LOAD_CONST              11 (0)
            171 COMPARE_OP               2 (==)
            174 POP_JUMP_IF_FALSE      196
            177 LOAD_NAME               14 (chr)
            180 LOAD_NAME               15 (ord)
            183 LOAD_NAME                8 (lst)
            186 LOAD_NAME               13 (i)
            189 BINARY_SUBSCR
            190 CALL_FUNCTION            1
            193 LOAD_CONST              10 (2)

 46     >>  196 BINARY_SUBTRACT
            197 CALL_FUNCTION            1
            200 LOAD_NAME                8 (lst)
            203 LOAD_NAME               13 (i)
            206 STORE_SUBSCR
            207 JUMP_FORWARD             0 (to 210)
        >>  210 LOAD_NAME               14 (chr)
            213 LOAD_NAME               15 (ord)
            216 LOAD_NAME                8 (lst)
            219 LOAD_NAME               13 (i)
            222 BINARY_SUBSCR
            223 CALL_FUNCTION            1
            226 LOAD_CONST              12 (1)
            229 BINARY_ADD

 48         230 CALL_FUNCTION            1
            233 LOAD_NAME                8 (lst)

 49         236 LOAD_NAME               13 (i)
            239 STORE_SUBSCR
            240 JUMP_ABSOLUTE          141
        >>  243 POP_BLOCK
        >>  244 LOAD_CONST              13 ('')
            247 STORE_NAME              16 (enc2)
            250 LOAD_NAME               16 (enc2)
            253 LOAD_ATTR               17 (join)
            256 LOAD_NAME                8 (lst)
            259 CALL_FUNCTION            1
            262 STORE_NAME              16 (enc2)
            265 LOAD_NAME                5 (encode)
            268 LOAD_NAME               16 (enc2)
            271 CALL_FUNCTION            1
            274 STORE_NAME              18 (enc3)
            277 LOAD_NAME               18 (enc3)
            280 LOAD_NAME                4 (dec)

 55     >>  283 COMPARE_OP               2 (==)
            286 POP_JUMP_IF_FALSE      283
            289 LOAD_CONST              14 ("You're right! ")
            292 PRINT_ITEM
            293 PRINT_NEWLINE
            294 JUMP_FORWARD             5 (to 302)
            297 LOAD_CONST              15 ("You're Wrong! ")
            300 PRINT_ITEM
            301 PRINT_NEWLINE
        >>  302 LOAD_CONST               1 (None)
            305 RETURN_VALUE


对于
[Asm] 纯文本查看 复制代码
        >>   14 LOAD_CONST               0 (-1)
             17 LOAD_CONST               1 (None)
             20 IMPORT_NAME              0 (string)
             23 STORE_NAME               0 (string)
             26 LOAD_NAME                1 (list)
             29 LOAD_NAME                0 (string)
             32 LOAD_ATTR                2 (letters)
             35 CALL_FUNCTION            1
             38 LOAD_NAME                1 (list)
             41 LOAD_NAME                0 (string)
             44 LOAD_ATTR                3 (digits)
             47 CALL_FUNCTION            1

  5          50 BINARY_ADD
             51 LOAD_CONST               2 ('+')
             54 LOAD_CONST               3 ('/')
             57 BUILD_LIST               2
             60 BINARY_ADD
             61 STORE_NAME               2 (letters)

string.letters是生成小写字母和大写字母  string.digits生成小写数字

也就是说 encode是base64加密

[Asm] 纯文本查看 复制代码
 
[/size][/align][align=left][size=14px]
64 LOAD_CONST               4 ('FcjTCgD1EffEm2rPC3bTyL5Wu2bKBI9KAZrwFgrUygHN')[/size][/align][align=left][size=14px]

应该就是密文了

再看

[Asm] 纯文本查看 复制代码
40          94 LOAD_CONST               9 ('Plz Input Your Flag:\n')
             97 PRINT_ITEM
             98 PRINT_NEWLINE
             99 LOAD_NAME                6 (raw_input)
            102 CALL_FUNCTION            0
            105 STORE_NAME               7 (enc)
            108 LOAD_NAME                1 (list)
            111 LOAD_NAME                7 (enc)
            114 CALL_FUNCTION            1
            117 STORE_NAME               8 (lst)
            120 LOAD_NAME                8 (lst)
            123 LOAD_ATTR                9 (reverse)
            126 CALL_FUNCTION            0
            129 POP_TOP
            130 LOAD_NAME               10 (len)
            133 LOAD_NAME                8 (lst)
            136 CALL_FUNCTION            1
            139 STORE_NAME              11 (llen)
            142 SETUP_LOOP              99 (to 244)
            145 LOAD_NAME               12 (range)
            148 LOAD_NAME               11 (llen)
            151 CALL_FUNCTION            1
            154 GET_ITER
            155 FOR_ITER                85 (to 243)
            158 STORE_NAME              13 (i)
            161 LOAD_NAME               13 (i)
            164 LOAD_CONST              10 (2)
            167 BINARY_MODULO
            168 LOAD_CONST              11 (0)
            171 COMPARE_OP               2 (==)
            174 POP_JUMP_IF_FALSE      196
            177 LOAD_NAME               14 (chr)
            180 LOAD_NAME               15 (ord)
            183 LOAD_NAME                8 (lst)
            186 LOAD_NAME               13 (i)
            189 BINARY_SUBSCR
            190 CALL_FUNCTION            1
            193 LOAD_CONST              10 (2)

 46     >>  196 BINARY_SUBTRACT
            197 CALL_FUNCTION            1
            200 LOAD_NAME                8 (lst)
            203 LOAD_NAME               13 (i)
            206 STORE_SUBSCR
            207 JUMP_FORWARD             0 (to 210)

先用reverse函数把字符串颠倒

在进行奇偶加密 然后base64加密对比

这个时候可以写脚本 先把密文用base64解密出来

得到解密脚本

[Asm] 纯文本查看 复制代码
lists ="124 34 109 112 103 117 120 81 94 51 100 105 115 112 109 98 94 112 83 96 100 110 47 100 107 52 86 124 100 110 96 104 103"
lists = lists.split(" ")
flags = []
for i in lists:
        flags.append(int(i))
print flags
flag = []
for q in range(len(flags)):
    flag.append(flags[len(flags)-q-1])

print flag
h = ""
for i in range(len(flag)):
        if (i%2==0):
                flag[i] += 1
        else:
                flag[i] -= 1
        h += chr(flag[i])
print h

flag

[Asm] 纯文本查看 复制代码
hgame{W3lc0me_To_anothe2_Python!}



0x04 brainfxxker's revenge


题目直接给一个C++源代码

[Asm] 纯文本查看 复制代码
#include <iostream>
#include <cctype>
#include <string>

// the description of this challenge is totally useless 2333333

// oyiadin, Jan 29, 2019
// have fun XD

namespace bf {
  
class Parser {
 public:
  Parser() = default;
  ~Parser() = default;
  void execute(const std::string &buf);
  
 protected:
  uint8_t data[1000] = {0};
  uint8_t *ptr = data;
};


void Parser::execute(const std::string &buf) {
  unsigned unmatched;
  for (auto i = buf.cbegin(); i != buf.cend(); ++i) {
    switch (*i) {
      case '>':
        ++ptr;
        break;
      case '<':
        --ptr;
        break;
      case '+':
        ++*ptr;
        break;
      case '-':
        --*ptr;
        break;
      case '.':
        putchar(*ptr);
        break;
      case ',':
        while ((*ptr = getchar()) == '\n') ;
        break;
      case '[':
        if (*ptr == 0) {
          unmatched = 1;
          while (unmatched) {
            while (++i != buf.cend()) {
              if (*i == '[') {
                ++unmatched;
                break;
              } else if (*i == ']') {
                --unmatched;
                break;
              }
            }
          }
        }
        break;
      case ']':
        if (*ptr != 0) {
          unmatched = 1;
          while (unmatched) {
            while (i-- != buf.cbegin()) {
              if (*i == '[') {
                --unmatched;
                break;
              } else if (*i == ']') {
                ++unmatched;
                break;
              }
            }
          }
        }
        break;
      default:
        putchar(*i);
    }
  }
}

}


int main() {
  bf::Parser parser;
  parser.execute(
    "<><><>-++->><<>,+-><+-+->++-+><-+<>++><><-++><-+<>+><<>-+-++[<><><-+-+<>-><><+-+-+--><-+><-><+-><--+"
    "-<><>+--><+--++-+--<>+--+-++--><><+---+-<>><--+<>+--<>><+-<>-><-++--+--+-+><+--+>-+<><>-+<>-][<<[>,."
    ",[-.+[.>->,]+,-]..<],<-..]-+<><-+-+--+><-+><--+><-+-+--+--+--+-+><-><+--++-<>[><><><-+<+-+-+-+<><>><"
    ">><-+><[><-+-<>+-+-<>]+--+-+][+..-+[+,<<[>[.[[>,>,<,,]<]++]<<..>.].]]-+<>><,-+><><-+-+>-++<>-++-+-><"
    "++-<>-++-+-++<>+-<>++-+-+<>[-++--+-+<<>--+<>-+><<>--+<><>-+---+-+-<>--+-+--+-+><-><><+--+--++-+-><-<"
    ">-<>+--+-+--><--+><+--><-+><<><>--><-+-+>--+-+-+][--<[>+>[,+>[->]-+]]+-[[,[<[+++--,].>,]<.>>]]..-]+-"
    "<><-+-+-+><+--><><<>><+-[+-><><<<><>+--++-+-+><-+<>>><[-+<>-]-+-+-++-<>]-+,>+++-++--+-+><++-<><><>+<"
    ">+<>><+-<>+-[<+--+-+--<>--><+-><<>-><><><+-<>-+-><><<>+----+-+-><><-+--><><-+-<>-<>-++--><-><->><<><"
    ">><-+-><+-+--+][<+[[-,-,>[,.,>,><-]]]<-[<[>-..]>++[>[>.,[.->[>-.[>[+.>.]-<-,],][-,[.<.+[[<>[+-].<<]>"
    "-.]-<],---].+]<]+,>->]>>]-<>]<><+-+-<>><-><><-+[<<>><+><+--+>[-+-+-+-+--++--+]+-><][.,>-]<><>-+,+-><"
    "-+-+><>+-+<>+><++--++-++-><-++-++--++--++<>+><<>[+--++-<><<><>-+><-><<><>+--<><>-+-<><>-++-+---+><<>"
    "-><--+<>><><<>-<>><-+<>><-><<>><-<>><-+-+<>-+--+--<>-><<>--+<><>-+--+<>-+>-+-+<><>-][[-.>.]>+.[+.<+-"
    "[[<.[<-[>,[>,.>[,,-[[-.+>++,-]++],>-].+>],+.>].-<.].+.],-[<>...+]+,]..]>.]+--+<><--><-><+-<>-++--[><"
    "><<+-+><-+>+-<>-+[><<>-++--<>><-+<>]][.[-[,>.[>--[[-->[.,+,,>,+]..,].<>>]++],.]<[>..[<[+[-<.++],-],+"
    "[<[.-.]>,.[[[>>->[[-.++]>,,]+]]],-],],.-+]+]<>]><><-+-+><,<>>+++-><+-+-><++--+-+><+-+<>++<>+-+-+><+-"
    "++-+-<>++-+<>[+--+-+<+-+--+--+-++--+--<>><><-+-+-<>+---+-+-+--<>-+-+-<>+-><--+-><><>-+><-+--+-++-]-+"
    "<>-+<-[><-+-+><><<-+-+><+>-+[<>-+-><]<><>-+-++-]-++-<>-+-+,-+<>><<>-+>+++-++-+<>+-+-++-><+-++-+><-++"
    "-++[><><><<><><><-><-+<>--+-++---+<>><-+><--><-++-><-><<><>+----<>+-+-<>--><-+-+--+-+-+-<>><>><><--+"
    "><><]-+<+--<>+--+-<>+--+-+--><<><>+--+-><<>-+><-<><>[><+-<>-+<+><><><><>><+-[<>><-+<><>--+-+]><-+],>"
    "<-+><>-+><+<>+-<>++><-++-+<>+[-+><><><><<<>-+><-+-><-><<>-+-<><>><-++--<>+--++-<>----><--><--<>+--+-"
    "--+-++-+-<>-+--+-+-><-+--+-+<>-+--+-+<>-+-+-+-+->-][[>>,[>[+>[>>>,<+.+],[,[,+<[.[,[+++].>,>>][[<<-[."
    "-+.]]-]]--<]+,+-],]>>],]<[[->[[+<>-<,+<][+.[,,[-[+[++>,-<][>>.[-+].],+.]<[---.,+[,++[-,,>]->>[++<]]]"
    "<],<]+>+<+]],.-[->>[<<[<.<[+-,,.+.]-,>]]-<,,]]+]>,,]><<><+-><<>+--+-><<>><><+--+-+--+><+-[-+<><>-+<+"
    "-<>+>-+<>><><<>[-]<>><-+><][,,[+.>->].,[.->--.<]>]><><<>-+-+,-++--+>+-+-+-+-+<>><+-+<>-+<>-+++-+--+>"
    "<+-++-++-++--++++<><><>[<><><>+-<><<>><+--><-+-><><--+><+-+--+---+-+-<>+--+>-<>><<>-+><][>--]+-<><+-"
    "><--<>+-+-><-><<><>-+<>[-+<<>+-+-+-+<>>><[<><>-<>><-+<>][.,,<.[,[.+[,[-.-[<<[+[[[<-,,.>>-+]-],>,[[,<"
    ",-<,].<<]--],]<+-<]+]<.>-],>+[-..>><>.]]><>[>--[,>><]>]>]]-+][+[,.<->][-[<.,].>+].++]-+<>><,><><>+->"
    "<-++><<><>-++><><+-+-+><-++<>-+><><+-+-++-><-++++-+-+<>-+[+-><-+<<>><--<>><+-<><>-><+--<><><>--+-+--"
    "-+><+--<>-+-+-+-><----+-+-++->-++-><-][[[.<+,,][[+,[>[-<.[-,->+,]+<,,+]>+>[-+--,--],+,],]]..],><]<><"
    "><-+-+-<>+-+--+-+--><><+-><><-[<>+-<-+++-><>[-+-><-+-+]><><+-<>><][-.+>[+[...[<<+[<.[<[+[,,]+[,<[,<<"
    "[..>-]++[-,<,]>]-,[,[>++]<--[>+,]]]+]><]-<,]..]-[,<,[[.[>+-,+->]>-<,.<]<+<<>]<]-+]..,,<]..<]-++-><,>"
    "-+><-+++-++-<>-+++-+><><++-++<>><-+<>+[+-><<><><><-+<>---><-+><+-><--+-<>->-]<>><-+<><-><+-[+--+<++-"
    ">+-><[<><>><-><+-<>][[+--+>>]<,[..,,.-]+--]+-<>><><][-[,,..-,],[<-.[+>[++<,+[<<-[+>]+.,]],[<,-,->].."
    "]..,<]<,.]><-+-+-+,+->+><<><><>++++-><+-<>++--+<><>+<><>-+><><+<>-+<>+<>+-><+-+-++-<>[-+><-+<><><+->"
    "<--+-+-<>--+<>+--+---+><--+><-+>-+><-+--+<><>][,<>]+-<>+-<<><><>-+-+-><-<>-+<>[><><><-+<-+<>><++--+>"
    "+-[<>><-]-+-++-][>>-.+,,+]><,-+-+>-++-++-><+-+-++<>+-+-+><><++-><+-<>+><-++--+><++-<>[+-<---+-+-<>><"
    "><-><<>-+><+---+--><<>><--++-+--+-><><-+-<>-+<>--><-><><-+-><+->+--+<><>-<>+-]<>><-+<>-+<-+-<>+-<>-<"
    ">+--++-[><+-<><<>++-<>>+-><><[-++-<>><--+><><+-+-]+-+-<>][.+.+,-+>]<><>,><><<>><>+><+-++--+><+<>+-++"
    "-><+-+-<>+><+-><><<>+><+-++-+-+<>><+-><[<>-++--+-+<<>-+--+-><-+-<>-+<>-><+----+-><----+><><-+-<>><-+"
    "--+><><<>>><+--+><+--]><<>+-<+--+-><-><><-++--+-><><+-><-+--><-[<>+-<><><-+<>+><><><>><-+<>[<><>><><"
    "-><<>][++,[+><[-.[.[>>++-]>>[<-+[.>[>.>[<[--.<.-[>.<].-+][>+[>]>+>>],,],[+<,[[>>>.]<+]-.-[.>.<<]]>]<"
    "+[..++[+-[,<[,..++>]]<,]],]-]>],<>[<>[<,[+.->>,-+.].<>[[.,,->>>]..-[><<--,,]],-<]<,]..-]].]+-<>+-][>"
    "[.>[,,.<[[<<-[[-,[..+<],[.+--[>,].<-].].--]-]->+[>[-.,+.<]<<<,]]<,<]>+],]+-,+-+->><><++--++<>><><><-"
    "++<><>++-++--+[+-><<>><<><<>-++--+-<>----><-<><>><-+-+--+-+-++----+><>-+-]+--+><+-<-+-+-<>-><><><<>-"
    "><+-><+-+-[+-<+><-+<>><><><>[+-<>><<>+--><><][<[..[,.[[<><[-,[.,.[...-<]+-,>+,]>,,]-]-+,<+-]-]][-[+,"
    "]+<.]>]-+-+><+--+]-+><,><<>><>><><++-<><>-+><++-+-<>+++-+-++-+-++-+-+[<>><<><-+-><+-><-+---+-++--+<>"
    "--+-+--++---+-+-+-++--><<>+-<>>--+><><><><][..-[>-<+[.+.<<-,],]><.]<><+-<>><--+<>+-><+--<>-+><+-<>[<"
    ">-+<><-++<>>+-[><><+-><+--<>-++-><][[.-.[,,[..]-+>].->[>[>[<,[+,[[.-+-,>>],<+[--+>>>.]+.].,]][[>,<[."
    "+<[[><.+]->,]]].-<[>[->,[<>,.<[.--+<[-<..-,]].+]][.-,<]+.]]],<],,-]--,[<.,<<[-,[+-++,,[>[>[>.[+,[[.>"
    ",++],.,]]>>[.[>,+,[,,]][<+-,<<,+].+,],..][+-[-[+.[+.<.<>+>]+..[.>]>><]]>[,-+[..<]-<],.+]]]+][>>,--]<"
    "<>]>].]><><+-]><><-+,+--+<>>-++--+-+++-><><+--++++-+-++-><<>+<>+><-+-+++--++-+><<>+-+-+-+[-++-+--+><"
    "<+--++-+---><+-><-+-+--><-><><><>+-><><-][.-,,>]-+<>+-<><+-+-><-+-><-+--+><-+-<>+--+<>--++-><<>-+-<>"
    "<>-+--<><>+-[<+--+><><><+><<>>><<>-+[+--<>+-+-><]+-],-++-><><<>>-+><-+-+++<>><++-++++><><><+-[<>+-><"
    "><<-<><>--+><-<>-+><-><-><<>-><-+-><-+--<>+-<><>-+--+<>--+--+-+-+-+-<>><--+><<>-+>-+><+--+-]<><><>-+"
    "<><<><>+--+-+-+-><-+-++--+-+--[<>+-><-+<><<>-+><+-+-+><+-><>-+><[-++---+><><][,.[>-<[>+.->],<<>>,]>-"
    "<]><<>]-+,-++-+--+>+-<>++-><<>-++-+-++-<>><+<>+--+><+<>><><+-+<>+<>><+--++><><-++[+-<<>-+-><<><>-+--"
    "+<>><-+><--+<><>><--><-<>>-+><-+-+-<>][>-+,<-]<><><><><-<>><><--><><><+--<>-<>-><-++--+-><+-<>[<><+-"
    "++->-++--+<>><[-<>-+<>-+]+-<>><<>]<>+-<>,><>-++-+-+><><-+++><<>++-+<>[><<><-++---+><<><>--+<>-+--+><"
    "><--+><-+-<><>><<>-><+--+-+-+-><<>><-+-<>-><><><><+---+-+>><-+<>-][>[[+[.[-++[[-<.[++-[[,<-<>>]+].>."
    "]>[,[[.<]],.>[+-,<+[.,>,-]+,-].<-]+].+-<>]]<+[,.]>.]>][,[><>>-].]--]]><-+-++-><<><<>+-><-[-+<+--++-+"
    "+-+->-++-[><-<><>-+-+<>][+[[>+,.[<[,+-[-+>--[[>>[><,[.->,][<.-,+]>]-+>]]+.<]>]-+<.>>]+]--<+].>-[[<[+"
    "[,[+<+>><[[+[<<[>+,.-<.]>>>[+<]],]+,<-]>],[[-+[-,..,>>].]..-]>-<]++],>.[.+.,]->-]]<->]><][++[<<,.+[["
    ">.<+-]+]]]<>-+<>,><>+-++-<><>-+<>+++-+-+--+><+<><>><+-++-<>[+-<><-+<>-+-+><---+--+---><-><><+-<>-+-+"
    "-><-+-><+--+<>-><>-+-+--++-+-][<,,>.]<-+<>><+--+-+-+-<>><[><+-><+-<><+><>+-+-[-+-+<>><+--]<>><-+><<>"
    "][,,-[<>>.,[>[[.,[,>+<++,.].++]>,][.,,[+.,[.>,]..<[>.-],]<]+.]]+-[+<+><].]+--+><+-<>,<>><-+>+-<>+-<>"
    "++-+-+<><><>-++><+-><++--+><++-+-+-<>+-+><-++--++-++<>><><><[+-+-<--+<>><-++----+-+-+><---<>>-+-+-<>"
    "][<,[+,[[+<+[[+-[-[+[.[>,-,]]<.>]]<[<,>.[+.].++]->]--.[<.>[-,+.>-<,]-.].,]-[-[.<,[<[.>+[[++<.-<>,]-,"
    ",]++[-<,,[+-,,-]],],-.].].>+].->]++.-]<-,[.[+[.,>[<,>>-]<+-[,,<[<.[+-[+>>>>[->>+,<]]+].-.].>[.>+<,[<"
    "[+<.-[+<,.]+].+<+]].<<]<]<[.<,+]-,<].<<>]]+<++]<>><-+<-+<>[><-+><-+-+<><<>><+-+><><>-+-+[><-><+-><-+"
    "][->[>[,[[<++[----,>[<[-[<+<++,]->>]<-]-]<>]...[-+<.-].<<][++<[<<[+>]+,][.->.-+]-+]<][,],<-]>.]-+]-+"
    "><<>+-+-,+-><-+><>+-<>+><+-><-++-+><-+++><-++-+><-++-+<>-+-+-+><+-+-+-+><-+[><><<>-+><<+-<>><+--+-+-"
    "<>><-+-><--+-+--++--><><+-<>-+-<>+-+--+-+-<>-++-+--+-+-+--++---<>-<>-+-+--++--><-<>><-+><>-+--++-><>"
    "<<>][<>[,++<-+<]>>.[<-<]]<[><<><-++<>+-><>><<>><+-[-][>[[-><,.,],[+<[-->[<[[.><[,+>].]+>[--><><-]>]+"
    "<>+-],.]->,[..<[<>,<+[+--+,].-]->,]].,].-,]-+][+[+<...]-[,.<,.+]+]-+,<>+-<>>+-+-+-++--+><++-<><><>+-"
    "+<>+-<>++-+<><><><>++-><<><><>+<>><[<+-><+--+-+---><-+--++-<>><-+--+-->+-+-<>-<>]<><<>+-+-[-++--+<+-"
    "+-+-<><>+-+><><><>[-+<>-+-<>+-><-+><][.,>++--<]<><><>+-][+,,-,+[-,-,,[+[.-+>-]+]-]+,]><,<>-+>+-+--+>"
    "<<>++-+--+++-+-+><-+><+-+><+--++><><<>+-++-+[+-<>-+<+-><+-><-+-><+-<><><>--+<>--><-+><<><>-><><--+-<"
    ">><>-+-+-+-+--+><][..>]-+><+--+-+<><--++-><-><<>><<>--++-<>+-+--><><+-[<><-++-><+><><><><>><<><>[+-<"
    "><>-+-+-><-+><><><]><><-+]<>-+-+<>,+-<>-++-><>-+><+><+><><+-><++-<>+-><+-+><-+<><>+<>+-+><<>-++-+<>+"
    "><+-+<>++-><><<><>[<>+-<>><-+<><+-<>+---++--<>-->+-<>-+--+><]-+-+-++-<-><<>-+--+--<>-++-><+--<>-<>-+"
    "-+-+--+-><<>><<>--+-+><<>[+--+<-++-<>+-+>+-[<>+-+--<>]<>-+><><]-+><+-,<>-++->+><><-++-<>+><+--++-<>+"
    "+--++<>++-<>+-+-+-+++-+-+><+-><><+-[><<--+-+--+<><>><-<>><--+-+-+--+--+--+<><>><+----++--+--+><-+--+"
    "-<>+-+-<>>+-<>-+><+--+-<><>><][->>+[+,,+[[<-].,+],,,]]-++-<-+-+--><<>+-[<-++<><>><>-+[-+><<>-+-+-+->"
    "<]+-+-][.-.]><+--+,-+>+-+-+><+-<>-+><++++<>-+<>+><+><+-<>-++><+-><+-<>++-><-+><><++-[><-++-<---+><-+"
    "-+-+--+<>-+-<>-+--+-+><><>><><+---+><<>]<-><><+--+-><+---[<>+-><-+><<<>+-+-+-+-+><><>-++-+-><[+-+--<"
    ">-+-+-+]><<>-+<>><]+--+<>-+,><<>-++-<>>+-<>++-+-+><-+<>+-++-><<>++-+-+><-+><++-+><+--+++-++-><<>[-++"
    "-><<-<>-<><>-<>-++-+--><<>-><+--++-+-><>><-]><><<+--<><><><><>-<>-><><-><-+-><<><>-+-+--+-+---+><><-"
    "+-+[+--+-+<><<>++-+-<>><>+-[<>-+-+-]><-+][-.[>+.,-,][,.->[<>.<-+],+<]+]+-><,><<>-++--+>+><<>-++><++-"
    "+><+--+-+><++--+-++-[+-+--+<-+--+-+--+-<>-+---+<>-+----+--+<>><+---++-><+--><+-><-+><--><+--+-><-+-<"
    ">-<>--+<><>-++--<>+-+-<>-+-+--<>><+-><><>><+-<>><-><><><][[.,[,[,>>[>[-,.<,++]<]]+<[[<,-.-]<,>.]+.],"
    "><[+,+<.]+]<[-,++>-.]>-,]+-<>+-<-+[<-+><+--++-++->><+-+-[+--+-<>><<>+-]]+-,+->-+<>-+<>-+++-+-<>><+><"
    "-+-+-+-+++<>-++<>-++-[<+-+-+-><-+-><<><>-+-><<>+--+<>-><<><>-<>-+-<>+-<>-+-+--+--+><--+-+-+><-+-<>+-"
    "-<>>><><-++--><<>]<><><><-><+-><--+<>-+[+-<><-+-+-++-++--+>[><<><>+-><--++-]+-><-+<>+-]-+-+,><+-+-><"
    "<>>><++-><+-+-+-++--+-++<><>+-+-++-+--++<>+<><>+-++--++[+-><<><--+<>-><-+<><>-+--+-><--><><+-><>-<>]"
    "[+,>.++,.]-+<><>-+<><<>-+-<>-><><+-+---+><<>--+-+-[<+><>+-><-++-+-[+-<>><--+><]<>><<>][+++>]<>+--+><"
    "+-,+-><+->+-+--++-++++-+-><++-+><><><++-+-+-++-+><++-+--+-++[<>-+<><><><><-+><-+-><+---+><<>><-<>-+-"
    "-++-><-+-><><>><<>-+-<><>><><+-]<>><-++-<><+-+--><-++--+-+-+-<>-><><-+-+><-[<><<>+><<><>>[><<>+-+--+"
    "-]+-<>+-]><-+-+<>+-,<>+->+-+><+><-+++<>-+++-+<><>><-+><+[><><<<>><><---<>+-<>-><<>-<>-++--><-+--+>-<"
    "><>-+-+<>]><-+<>><<><><+-<><>[-+-++--+<+-><+<>>+-+-><-+><[-++--]><><][.,<[--+[[->.[.-[[,[,,.[,[-.,],"
    "<++]--+[-<-]<,].->[-,[.><][.><]<]]+--><+]<[.-[<.<+>[.>[,[,,-][+,<],]]>]-><+,]<>]>+-][><,[.[<-[+,+--."
    ">][[--,[>-[-,-,.+]-+,+->]]--]><+].[,,<-+],<<]>..<<<]>.-]->]<[[,>[,[[,<+]<+]>].,+]->].+]-+,+-+-<>>-+>"
    "<+-+--+++><><+--++<>-+><+++-><><-+<>[-++-><<><><><<>-<>-+--<>><-<>-+-<><><>-+-><<>><<>-><+-<>--<>><>"
    "+-+-<>-><-+<>-+<>][,[-.>[++.[>,<]][-.+[[>.[>.<.>[[..[+..>],,.-]-.-[--[>>>>,][-,,-]]><>]+-]]<[,>[-[--"
    ",<.+>][>[[<[<.<+.]]<.[+[.<][,>+>+,],,+]>++]-->[-[-,[.<,-]>+.]->--]++]-]<->[++[,[+>>[-.+.,,+-]>,].-<>"
    "]>]]+]<[>>[[[+,+<<<]+]<,],,[.,[[,[<<<+[[<.-][.>.++<]]<]<<[-+<[.[-<+>+<>]<.]+,.,]<+],[[>->[..[.<<++.]"
    ">-]].[>..[<[<-+][-<,.]>,-]<,<-++]+,]>>-][-<>]-]>+-]<]][>+[,.[,[->[.>+,,[-<,[--[.-[>,,+<+<]->.,][[,.+"
    "][---+,]]]>[,++,->+]]->>]]...]+..]]>]<-+-+-++--+-<><><>-><<>+-<>-<><>-++--+[<+-+>-+-+<>[-+><+-><-+-]"
    "-+][<.<-,<+]+-,><>-+<><>-++-++--++<>+++-+--+<>++-+--++[><-++-+--+<-<>-+--+<>---+<>><+-+---+<>--+><><"
    "-+--+-+-+--++->><-+><<>-+--++--+]-+><<+--+-+<>-<>[<+-+><+--+<>+->><><[--+-+-+<><>]+-><<><>]><,><+-><"
    "-+>-++-++--++<>+-+-><+-+<>+--+><+-+><><++--+-++-+[+-+-+-<-+---+-+<>+-+--+-+--+-<><>--+><+---+><--++-"
    "-+-++--<>-><<><>+-+--<>><<>><<>---+><<>><-+-><-+<>><><-<>+--<>+---+><<>-+><>-+-+-<>][-[,,+>.[,<->[,,"
    ">]+-]]-[>+[++.>]]+]><><+-+--+<-+-+--++--+-+<>-<>-+><+-<>[><-+<+>-+[+-><-<>><+-+-><]><],-+><>+++-><-+"
    "+-><++--++-><<>+<>><<>+-++-+<>><-++-[<>-++-><<+-><-++--+-+--++-><+---+-<>+--+-+-<>><><-+-+--><+-><--"
    "-+<>+--+--+-+-+--+-+-+-+---+-+--+-++--+--++-<>-+--+-><>-+-><><][><[-<]+[<++.[.+.[+-[.[[[+><,][<>[+<<"
    "[<.>+>+]+.<],,<[,.>[>.+<--]-[,.,-,,+.]>+]-]].,<+][<>++]+<],-[[[,,++<>+]+<,]<<.[->.]<>.]],[-[++<]-,]>"
    ">]+-]]><<+--+-+<>-<>><><+-<>-<>-+--<>-+><[<<>><+-><+><-+-+><>+-<>+-[--++-+-][,.[--<[-<.[.[+[>.-],>+["
    "[<<]-[-[<+[+,[.>>>-],<]..<,->][+-<,-]-+]>,+]-]-]]>>[,+-+<]><]-,,.]-+][,->[>-[<+.-][>+[.[[>[[,<[<>-[,"
    ".<><].[+,,+<--].<]]-,.]..,>].<].><]>]]>+[>,+>]],>><><><++-+--+-+<>+-+<>-++-+-+><+-++-++--+><+<>><><>"
    "<[+-+-+-<><-><<>+-<>-<><>-+-><-<>+--+--><><-<>-<>-++-><><><>-+-+-<>><><+-+-][.<>[-<+<+>]-++<]<>+-><>"
    "<-+<[<+--+++-><+-><+->+-<>-+[<>-><+-><<><>][[-.[>+>-]-]<,+]><<>]<>-+<>-++-,><><<>>><-++-<><>++-<>+-+"
    "-++-++-++-><++<>-++--+<>+<><>++-+-<>++--+[+-<-+-+-+--+<>+--<>--+<>+---+><+-+-+--+--+-++---++--+-<>-+"
    "+--+-<>-+<>-+--+><<>-<><><>><>><-><<><><>]+-><<+--<>-+-<><>-><<>-+><--<>><+-<>--+-+-++-+--+-+-+-><><"
    "-><[<-++-+>+-+--++-[-+<>-+><-<>+-><-+][><[+[,+.[,[[+<[>,+[+.[<<+>.[+<,+]>,]>[.,>>[+,-]>]>]>.][<[->-,"
    ".>-.+].-],][[-<,,,[+,+,]]-]],>-+]+-[..-<+,.],]<<+>],]+-><-+][><>,[.<[,>-[<.<,+<>][-+<><-[<->.,--]<-]"
    "-,<],,-.]]+-><+-,-+>+<>++-><><><+<>+-><-++<>++-+-+><+--+++><+-++[><-++-<<>><-+><+---+--++-><<>-+--+-"
    "+><--+<>><-><-+-+-><+--+-+-+-><--+><<>-<>-+><><>+-<>><-+-][[>[[[-,,><<].,>].,<]><+>-,].[,++[->.[+>,["
    "[-->[[.>.[-+<,]+><>,],,+.]>+-]<.>[>[<<+[>.[<[<-<+++],]+.,.]<,>,]-[-+.-,]],]<+>]<,-]<>[-,[-++[,-<[<[["
    ">,[.+<[,.>,]-<>][.,+[+,>><]+,],>,]>>.+,]+<.]++,]++],[>[-.>[>>[[-[<+.[,>,,--]-]]>-]+<>>-]>[.>[-.+[-,<"
    "-]<+<+]]<<-]<,[,.[+-.[-.>[>-[<[+<,>]<]]<->-.],.]-]+].]-<],.-]<>+-+-<+-+--<>><-+--+-+---+-+-<>+-><-><"
    "-<>[<><-++-+><>><<>-+[<>><-][-,[[.+[+[<[,,[>,>[.,,<][>[+,[--++<.<]-,[><-.]-><]-.[,.[,,+]]]<<<],[<>-<"
    ">.--]<],+<][...-<-]-]>+,,]]-]<>><<>]+-<>-+><<>,-+<><>+-><>+-+++-><<>><+-+-+-++-+-+-++-><-++<>+><><+>"
    "<+<>-+-++-++-++-><><><+-[><+-<>><<+--><+-<>-+<>-><<>--+<>-+><--+-+>+-<>-+-+-+-]+-<--+-><<><><>-+-+--"
    "++--<><>--+-><-<>-[<><+-+<>-+>><+--+-+[><+-><><><-+--++-><][[.,[<[+[+.,[-<<>.]][.[+.><-[.,[.-[+.,.]-"
    "[+[.],>-[>..+,+,]>],]>]<]].,+]]>-,]>+>+]]-+<>-+><,><>><<>+<>><+-++-++-+<>+-+-<>+<>+-+><++-<><>++--++"
    "--++[+-+-<+-><+-><+--><-><-><+-><<>><-<>-+-+-<>+-+---+-+-+><><-><<><>-+-><><+---+><-<><>-+>-+-<><>+-"
    "][.[[+>[,+.[--[--[[+>[<,[-,.+>,-]][<[-.+,>]><,].]<].>[-,><]>.]<]].,,.,+].<[-,..-[>.--<-]]+]-]<><>-+<"
    "><-+-><-<>+-<>><+--<>+--><--++-<>-+-+-><-+-[+-><<++-<>-+>><[><<>+--<>-+<>]][+>><.+[.-,>[[.><[<<>[>[<"
    "[-,+[,>>[<<,+<,.+]+<]<[++>],-]>++++<],.]+>+].+]>.]]]><,><-+-++->-+-+<><>++-<>-+-++><-++-+-+<>+-<>+-+"
    "><><+-++-+<>-+++--+><><+><<>><><<>[+-><<>+-<-<>-+-+<>--+><-+-+-><><-+-<>><-+-+<>-<>-+--+><<><>>+-+-<"
    ">+--+--+<>+--+]+-><-+<>+-<-+<>+-><[-+<>+--+<-+-+<>+-+><>[-+-+><+--+-+-]<><>+-><-+]><><><,<>>+-><+-><"
    "-++><+><<>-++<>+--+<>+-++-+-+-><><+<>-+-++-><+><-+<>-++-+><-++-+<>><++-<>><><+><-++-+-[<>><-+<-+<>--"
    "-+-<>-><-+--+<>>+--+-+-]-+><+-<><+-+-<>+--><-+--><+--<>-++-+--+[-++-><+-><<><<>-++><-++->[-]><][<[><"
    "...<][-[<[-[>-><,>+-,][,-><-].<],>.]<>>,]<<+]<>><<>,<>-+-+><-+>-+<>><<>+-++<>><+-+<><>++-<>+-+><-+><"
    "++--++-[<><+-><-<>-><+-><-+-+-><<>><-<>><-+><+--+--+--++--><+--++-+--><-+-+-+--+>+--+<>-><<>><<>][[+"
    ".[->[[[]-.]><[>,>[.[,[.>[>.+,.+]-++]>-]>-,]>]].<[.,,[++.<,,>]-<.<,-],,<]>[.>,[+<[--.<--]+<+[.>-[-<[["
    ">+,+]+>][<+,]+]->[,>+[+.+-]--<[+,-[[<-.<][,[+<<,-,,,]-[,,+]]<,+]+.[,<-[..[,++].]].,],+.]<]+]]..]<[-<"
    "[+++>[[+.+[,-,[-<+[<<<-++]]]>.+]+-+[<+[-[>.-[.[<<]-,],+]>.]<,[,-,[+.>[,>+]<.-]+.],].++]>,],]+<,]+-<>"
    "-++--+<[><><<<>><<>-+-++><-+>><<>><+-<>[<>+---+><][,-[+-[>.-<],+<]]][.,+[+<>[..[[++[,..>-.]+.++>]+>."
    "]->-,]<,+<+],+[<.[<[+.,[[.,,[<<[<->>+]]>>[,.[+>+.-]--+[+[+>.-]-]<+.]-]+->][+[+-[-,,,,],+>[[.>[+-,>-<"
    "]]].]+<]<]++][>,+.+>].>],.]><-+-++-,+-+-><>><><+-<>++-+++-<><>+<>+-++-++-><-+-++-[+--++-+-<-+-+-+--+"
    "<>-+-+-+--+-<>-++-><><--+-<>+-><-><><-+-<><>-<>><>-<>][<[,,.<].->]><<+--+-><+---+-+--+--+-+-><[<><+>"
    "<<>>+--+-+<>[-][<>,[->,[[,[-[.[>+].[,++,,,-]]...,]-<-[<[.-.[><<[-,<-<]<<[[>.<->]+-[+[-,].,+[,><]<+]>"
    "]+<,]<]]++-],.>].,[[[[>-[.,.[--[[-.-.>]<]+[,<[>,>+<].>]>,-],<[-.+[>-+,<]>,]<]]]+-,-]+[--<[>+<<[>>,.>"
    "]+-]-.]><]<>.][,+-[-++>[-+[-.>[-.[,<+>]<+<],+[[-+-[<[[>-<><>->-]<[+,,]]>+[+-->]].]+.[.[<>[<<->.[<<.+"
    "-<,],,]-<+]<>[,.[>-+[--<--+.]>--][.,,>[,,<<,>.+-]++,]>.]-]]>+,]<.-+++],><],-.],,]][+>]-+><-+,+-<>>-+"
    "+--++-+-++-+-+-+<>-+<>+><<>+<>-+<>+-+><-+-+><+><+--+<>+<>+-+<>[+-<><+--+><><+---+-><><+--+-<>-+-<><>"
    "--<>+---><+--+-+--+-+><+---<><>+-><-+-+->-+<><>-+-][><>.--<<]<><><+-><<>+---+--+[-++-><><><<+-><+-+>"
    "<>+-[-][>[+[-<[[+>+[.[-<,]><[.<<[,>.+,]>>]--<],[,.>.+]+.]<[[<.[>-.+,][.,>,]]>>-[+<>]<]+]>+].].]+-][-"
    "><[[.->[[[+<[-,-,[.<>]-<,]+>,]+]<[>,..+-->].]+<.]<-[<<[[-.>[-[->.,>+]>,[>>[[[>.--],[.<..-><]--]+>[+["
    "+,>,-+][,,--+<]>.<]>-]+<+,]].],[.+,-]..]>+.<]-,>]<>->,>]-+-++-,><-+><><>+-+--++++-+-<>++-><<>-+><++-"
    "++-><+-<>+<>><-+><-++[><-+<><><<>-><><+-+-+--<>+-><-++--<>+--+-+-<>+--><-+-+---<><>-+<>+--><+--+-><>"
    "<+-+--+-<>-<>+--+><-+-+-+--+->-+><+---+<>-+-++-]<>+-+-<+--+<>-+-><-+--<>-+<>+-><--+><><[-+<>+-<><+-<"
    "><><>++-><>[+--+><<><>--+<><>><][[>],+]><<>][[+[++<+]+->.]<>-[<-,]]+-,-+><>><<>+<>+-+<>-+><+-+-++-<>"
    "<>-++><<>+<>-+-++<>><+><><+<>-+-+-+<>+<><>+><[<+-+---+-<>><-+-><<>--+><><<>+---+-++-><+->-><][,+[,[>"
    ">]+<[<>+<>,]+]]<><>><<><+-<>><-+-<>+-<>><[+-><<>+-+-<+-+><>-++-[-<>><<><>][,<+[,,.[<-[[<-[[--.[<[+.>"
    "]-<<<].,-]<[<>[.+>[+[-<>+>,.]]]-.+]]-,]>->],>]<<]+<[.,+[<[[<[.[+[.[.<[+.,]<].><]>,--<]<-+[>.[>,-[<<,"
    "<--.][,,<-<[<>+-+-,,],]][+.+[[<.-<,]-++[-.-.,],>,]-,]],+]<>]>][[>>.-<]..,]>-]<+-]]<><>-+][<,.+,-]<>-"
    "+,+->-+-++-+<>+-++-++-+-+-+><<>+><<><>-++[<><-+<>-<>--+--+----++-<><>+--<>-++--><<>-+--+>-+<>-++-<>-"
    "][++>[+].+.]-++-<><<>><[><><<><><+-<><>+<>+->-+-++-[><-+-+<>+---+><><]<>][-..[>,]--+]<>-+,+-><+-<>-+"
    "><>-++><><><++-><+-<>><+++-<><>+<>+><+-+-+-<>[><-+-+><<-++-<>><--+-><-+<><>-<>-++-><-+--++-<><>-><><"
    "-+-><-+><+--<>+-->+-<>-+-+><-><-+][+.-[.<.->--.]<]+-<+--<>+-<>><><-><<>-+-+-+-<>-+<><>><[<><-+-++--+"
    "+-+><>-+><-+[+--><]]><><,<><>+-<>>-++-+-+-+-+++--+><+><-++-+><++--+++--+-+-+++<>><+-+--+[><><<<>-+-<"
    ">><<>+--><<><>+---<><>><+-<>--++-><+--<>--+-+-<>-+><<>-<>-+-+><><-><-+-><+-><-><<>><>-+-+--+-+><-+]["
    "<..-,-.,]><+--+><+-<-+--+<>-<><><>-+[><<-++-<>++-<>-+<>+->-++-><[--++-><]][.-..<.[+<+]+>.]+-><,><+--"
    "+><>+-><-+-+++-+++-><+-+-+><><-++++-+-><+[<-+<>+--+-+-><<>+--><><-++--+-+--<>><<><>-><-+><-+><-+--+-"
    "+-+--+>-><-+<>]+-<><-++-><--><<>><+--><+--+--++-<>+--<>><><><<>[<>-+><-+<><<>><><+<>+-><+->-+-+<>><-"
    "+[-+-+><><><-<><>-+][[,<,[.>,.]<+,],,.>,-]-++-+-><<>][+-.]<>,>+<>+<>-+<><>+-+><><-+++-><+-+[<>-+<-><"
    "-+--+--+-+---+-<>><-<>-+-+---+<><><>+--><-+><<>>-+-+-+-+-<>]+-<><--+[<><><<><>><+<>-+>+--++-[+-<>+-<"
    ">+--+--+><]><-+><]<>><><<>><,+-<><>>-+-+++-++><><<>+++-++<><><><>+<>-+<>+--++<>><<>[+-+--++-<-++-+->"
    "<-><<>-+<><>-<>-><-+-+--+-+><-><>-+<>-+-+-+-]><-+<><---><><-++--+-+--++--+-+--+><--[+-<+-<><>-++-+><"
    "+-<>+-+->-++-[<>+--+--++--+-++-][+>,-->]><<>-+][>-,[-,<[,<<+[<<-<-,[-<-.[.-[,[->>[,<---[>],]-+]<-[.+"
    "<,>+]],->],-+]<]]-.,[<>-[+-+[,+[<,,[,[<[++,+]...-]]+,>.,,]>++].].+->]]-+,<]><-+><,-+><><><>-++<>+-><"
    "-++++><++--+-++-<>+<>><+-><+[><><+-<>-+<-+-+<>--+---+-+--+-+<>><-+--<><>-><-+-+---+-+-<>-><><><-+---"
    "+><->><+--<>-+-+][>->[>>><>>,<]->>[[+,>[->++]<+.]--[.+>.,+]]]<>+-<<>><><-><><-><><-+--+-><<>-++-[-++"
    "-<>+-><<<>><+><-+><-+><><>+-+-[-++-+-<>+--<>><-+][[>>+[+<[.[,<+[[[.-<[<,<[++-+--]<]]-[<>[.]<<<<<<]<]"
    ".[<>[.-].,]]++-]-.]<]-][,[<<,]<.-.+]]][+.>[.+-<-]]><-++-+-,-++->-+><+++-<>+--++<>+<>-+><><+-+++-+--+"
    "-+><[-+-+-+><<><<>-<>><-+-+-<>+--+<>-<>-+--+><><+----+-+-+-+---<>><>-+<>-][,-,+]-++-<+-><><[-+-+<><>"
    "<+-<>+<>+->+--+<>[><<>-+-><-+><][>.>[-...+>+<<]>[.[++[>[.<[[,<>[.[[,+-+>-,]><,[+>-.<+<]-<<][.,>.[+-]"
    ".,+]]-+[.-+,[+<.>]]<+,]<>]+<],][<.>[+<[><.].,[>>.]]-<,]]<[<.>[,+-.,]+,-]+,]<<]><-+-+][..,[[>-[,,.[<["
    ">[<<>-[>>,]<+].>]<<>[+-,,,>],>.]]++>]>-<]>+<+,+]><+-+-,<><>>+-><+-+-><+<>><<>-++-+><++-+-+-+><+<>+-+"
    "+--++-[<>+-<><-+<>+-<><>--+><<>-+<>-><+-<>-><<>><-+--+><<>-+-<>><--++-><+-+--><<><>-<>><-<>><<>><><-"
    "-<>><--+><+--+-<>-+-+--+-+<>--<>><><>-+-><+-]+--+><-+<><-<><><>[+--++-<>-+<<><>-+<>-++><+->[<>-]><<>"
    "-+<>][+>-+[[[.><.-]+..],,-,]]><<><>+--+,><>+-><><><+-+<>+><+-+<>+-++--++-++-+-+<>+-><+-+-+-+++-++-+>"
    "<><<>[+--++-<<>-+-<>><-+><><-><-++--<>-+-+><+--+-<>-<>-+-<>><<>><-<>-><-+><><-+-<>><>--+-+][.-++,,+,"
    "]><<><-+-+<>><-+-<>-+><-><--+<><>+--+-+-><-++----<>-+<>+-><--+-++--+[+--+<><++-+-><<>>-++--+-+><[-+-"
    "][-<++>]<>><][<<[.>-[.-[++[<,.[.-[,>[[,.[.>><.][-.-,]-]]>,<[>,--[+[,->><]-]<]>+].+-[[>+<[>[.<>].,],]"
    ".]]>-,[<[,.>][<+[<[[<<<>>].>+]>.]-<[<>[>.<[,>.-]>,,<],.-[>[>.<+>--]+>]<>]-]++]<+.]+.,[-+[[-,.+-[,,.+"
    "+.].,+][+<+[,<[.-[>+-,,]<>-]>,<]<[>--[[<,>-]>]>[-.>->-]+]+]>]+><,<]>-+]->.[[,+,<->[>,+[,+.,>[.<]--.]"
    "<.[,<>[-[+<,>,[+-,-]]+-[+<+[+.>.]<]>],],]]+,].],<.]>><]><+-,>-++-+--+-+++-+++-+-><><++--++-><++-[+--"
    "++-+--+<<>+-<>-+---+-++--><><<>-<>><><--+--+-+-><-+-+-><><<>-<>-<>+--++-><>-+--++-][-.>[<<[,[..[<[-."
    "[<[+->.]+<],.[+,[.<+],[,<[..[.+,]][<++><<]-<+]-,>]<+].,]-<]]<[+<,[..[><[>>+]<<>.+]-[<.+]]]>.].>>[.[."
    ">[[-++[-+<[,-.+,]+++[>+,[-,+<>[>.,[>,>][...]>]-.]><<[,<-]+].]-],[.[[..<[>[.-,,<,[++,.+]<,+]<-+[[---,"
    "<>].>[<-><+-<.<]],]<,<+><][<-,[+++>+>.]->++<]<,>][..+,[,-<<[,>[[>-++<]>[,].+][[+,+][.+++>+],>]]<]+]>"
    ">]<+]+]<>..+<]]><><<<>-><-[+--+<-+-+-++>+--+-+-+[><+-<>><-][-+--<]]+-,><<>-+>-++--+++-+-+-+-+-+><><+"
    "-<>++><+--+><+><-++--+><+><+-<>+-<>+><<>+<>-+<>><[<><><+-+-+---+<>--+<>-+<>---+><><+---+<>><-+-+--+<"
    "><>+--<><>-+-+-+-+-<>+-<>--+-<>-><-+-+<>-+-<><><><>><>+-<>-+-]<><-><+-<>><-+--+-+<>-+><--+-<>+-<>-+["
    "><<>+-><+-<><+-<><>+-++-+->+-<><>><[-+-<>]]-+,+--+><>><><><<>+><-++-><+++--++-+-++-++-+++-+><<>+-<>+"
    "+-><+-<><>[<>+-+-<-><-+-+--+--<>-++-<><>-<>+-<><>-+--><-++-><+---><><+-><<>--+-><<>+-<><>>-+><+-><<>"
    "-><<>><]><<><-+--+--+-><<>[+-><<-++-><><<>+><+-><>><<>><><[-+-+-><><<>][->[,+[<[[><>[,<<,].<>],.-,>."
    "]..-[>,+[.,-[.,[[+..[-++++[->>]..<].+]+]+-<][,>.[,+,<-[+<,[>+[+,-<+-,]-,+[<-<<]<]>.,]-].<+[>[><-<->]"
    "[><><>+<]]<-.]>.]>.],+.]><]<.>]+--++--+-+][[>>>]-,>+.]+-,>+-><+-+-+++-+-><><+><-+-+++-><++><><<><>++"
    "-++--+><><+-++--+-+[-+-++-><+-<--+<>><-+-><-><+-<><>-<>-+><-+><--+-+-<>><----->-+-><><<>><][>+->]+--"
    "+<><><<>><+-+-+--+-><<>><+--><<>-+-+-<>[+-+-<<><>++-><+-<>+->[><-+<>+-<>-+--+<><>+-]+-><><<>+-][+.<<"
    "-,]<>+--+,-+<><>>+-+-><+-+<>+-+><+--++-+<>-+-+-++++-+<>+-+><[><><+--+-+<+-+-+-<>><-><-+-+-+-><-><+--"
    "><-+<>--+<><>-+<>-><<>--+->+-+--+--+><><+-]><<-+<>><[><<>-+<>-+<-+<><>><++-<>+->+-+--+<>[-+<>-]><><>"
    "<><+-]><+--+<>,+-+-<>>-+<>-++++><<><>-+<>+<>-++<><>+><+-++-<><>><++-+--+[<-<>+--><+--+-+--++--+--+-+"
    "<>+--->+-<>><+--+-><][-.<[>,+[.[<>[-[.<[-.[<++[<[,->.->-<]>-[<<.>-]--]]<<+].].--,-],>.]][+<]--]-,.[["
    "--]-.,]>+,]+-><<><+-><--><-<>-<><>-+--><--++-[+-><<>+--+<<>-+-+><+-+><>[+-+--<>][<[.-,+].-<]+-><><+-"
    "-+][>+[[<>>>][.<>].]++,[.<[.<<<[<[+,[+-[>[>>+<.[>,,-[,++<<]>>+].]>]+.].][,<,[>,-[,,,+[<+>[+[-],]-><]"
    "]><<[,-++-,.-]]<>],<]<>]+>],],-+><<><>>><<>+><><-+-+++-<>+><+-+<>+-+<>+-+><+++-+-+-<><>+><-+><<>+-+>"
    "<><><+-[<-+<>-+-><<>-+-><><><><-><><+-+--<>><+-<>+--><><+-+->-+--++-][[-[<,.[>-<[+[,<-[.[,.-[<[->,+<"
    "]><.],]>]-,<].[-<<<[[.[--+[---++-+]>+<]<<]<-[++<-]+]],].+-],<[.,[.-.[-<[.+.[<,,]-,]<]-,+>]>>,]]>>+],"
    "[,-<]+-]-++-<><+-+-><><--++---+-+-+-[-+-+<><+><><><>[-<><>][..-]<>+-><-+][,,<[<,-]-<]><+-,><><>><<>-"
    "++<>-++<>+-++><<>><-+-++-+<>++-<>-++-+><-+<>+-++-[<>-+<><>><<-+--><--+<><>><><-><--+<>-+-<>-++-><>><"
    "--+><]+-+-<<>><-+--+><<>-<>><-+-+-+-<><>+--><<><>[<-++>-++-[--++-<>+-><]<>-+-+><-+][<,+<<-+]-++-,<>>"
    "<-++-><>-++-<>+<><><>-+-++<>+-+-><++-+<>+-++-+-<>><+-++-+-+-++-+-[-+-++-<>-+<--+<><>-><><<>+--<>-<>>"
    "<-+--><+--<>-++-<><>>-]+-><+-<><-+--+><[+--+<-+<>+-+-+-+<>-++-+-<>>+-<>-+[-><><+--+><]+-+-><<>]<>+->"
    "<-+,+->><><<>+-+-++-+<>><++-><+<>><<>+<>++-><+-><<>+<>+<>+><+-><<>[+-<><><+--++-<>-+--+<>-<>><---+--"
    "<>+-<>+-><>-]<>+-<+-<>+--++--<>+-<>-><<>><<>--++-><><[><+--+-+<-+><+--++<>>-++-><[-><-+-+]]-+<>+-,+-"
    "-+><-+<>>+><><+<>><-+++-+--++-+-+-+><+-+-+-+<>+-+<><>+><<>++-++-[><+-+--+<><+-+-<><>+---+<>+---><<>+"
    "--<>-+-+--+<>-+--+><><<>-+--++-<>-+--<>-+-><><+--<>+-><<><>>><><-<>><<>-+][++.]><<><><+-<>---+<>-<>+"
    "-[><+--+<><-+<>++-<>>[<>><<>+--][-<[<<[>-[+[<[[[+<<[[]+<<,+]],.,]+<.].-.-<]+]+>,[+>[[-[+++[,+.+[[+,."
    "<>-],,.[-.<<-]>-.],>+]+.[+,.<<<[>>]]]]+]+++]>-]>>.+][,,<>[--<+]]>,]+-><<>+-][.<.[,<[..+[,.<]>-,[,-[."
    "[++<.+][-[<+->>]-,-<].]<[->-[<,<[[-,><[[.>><-.],->..<],]]]>.-]]<<>].>[++.+-[[+<.[<.[>.[>.[-+[<.-,,]<"
    ">.]+<+].]<+[<[+-+-]+<,].<][[.+<-+[[[+,]<]-+,<,<]<,].>]]>.[>.[-,[>-[><[.-[>><.>,]-+<[,<.<]-].],[.[>>+"
    "<<<]<+.,+]-+,],+[+.<<>[,--><<.].<,],]+[.<[.<[<->]]>.>[[.>[,,>[,+-><,]>[,>+<.]]]-<<-]++-].]>+]+,]]>+["
    ",>.[+-[..,,<<].[-<[->+--].>-[<>[,.->+>]-[-,.-+<-]+-<],-,]-]+>[>-.[>+>+[,<[<.<,-]-]+]>-.,]]>]><-+><+-"
    "<>,>++-+-+><<>><-++><+-<>+-+-++><><<>-++-+><[-+<+-<><><>-><-+--<><>+--><-<>><<><>-<>-<>-+-+-<>-+><-<"
    "><>-<>><-++--+--<>><--<>-+<>+-<>-<><>+-><--+-++---<>-+-++--<><>+--+--++->-+<><>-><<>-++-][.<,.,]-+-+"
    "<-+><-+-><><+-+--+-><><<><>--<>+--[><><+-<><+<>+-><>+-+--++-[+-+--][[>[[.<..,<>]+[>->-,[.<>,]>.]]+-,"
    "<<.]<+[,<[+->-+]+]]<>][..[+>.>.+-]+,]+-+-+<<>-++-[><-+w+-r><<>+-o-+><<>-+><n><<>+-><g-+-+>< <>><a><>"
    "<+--+n+-><><s-++-<>w<><>er!<><>><<>>[-><+-><][[,+[-[>+,[<,.[<[[[>+>>,[.+.,.>]<+>]>]++[<[.-]<.-><]+]-"
    "+<[<-->[+[<-<.]]]>,][>[+-<[><,-[-,+,+<-]<]>++-<]]].,-]+..+],+-[+>,+,<>-]+>-],>-<,]+-<><[-><><<>-+><]"
    "+-+-><+-]>[<>c+-o><<>><n<>+-><><><g<>+--++-+-ra+-+-><<>t+-+-u+-l-+<><>-++-a><-+-++-t><><<>i><+--+<>o"
    "<>-+-++-><n><><-+><-+s><!+--++-><[><+-+--<>]><-+-+><]"
  );
}

其中 ptr指向data数据区 '>' 为ptr+1 '<' 为ptr-1  '+'为ptr指向的数据加一  '.'输出data  ','输入字符 存入data '['和']'表示跳跃

先改一下代码 去混淆 把+- -+ ++--  --++ <> 这样的字符去掉

[Asm] 纯文本查看 复制代码
        void Parser::execute(const std::string &buf) {
                unsigned unmatched;
                ofstream f("C:\\Users\\x1c\\Desktop\\50.txt");
                int cout = 0;
                auto ptrs = buf.cbegin();
                int t = 1;
                for (auto i = buf.cbegin(); i != buf.cend(); ++i) {
                        switch (*i) {
                        case '>':
                                if (*(i + 1) == '<')
                                {
                                        i += 1;
                                }
                                else if (*(i + 1) == '>' && *(i + 2) == '<' && *(i + 3) == '<')
                                {
                                        i += 3;
                                }
                                else
                                {
                                        f << *i;
                                        cout++;
                                }
                                //++ptr;
                                break;
                        case '<':
                                if (*(i + 1) == '>')
                                {
                                        i += 1;
                                }
                                else if (*(i + 1) == '<' && *(i + 2) == '>' && *(i + 3) == '>')
                                {
                                        i += 3;
                                }
                                else
                                {
                                        cout++;
                                        f << *i;
                                }
                                //--ptr;
                                break;
                        case '+':
                                if (*(i + 1) == '-')
                                {
                                        i += 1;
                                }
                                else if (*(i + 1) == '+' && *(i + 2) == '-' && *(i + 3) == '-')
                                {
                                        i += 3;
                                }
                                else
                                {
                                        f << *i;
                                        cout++;
                                }
                                //++*ptr;
                                break;
                        case '-':
                                if (*(i + 1) == '+')
                                {
                                        i += 1;
                                }
                                else if (*(i + 1) == '-' && *(i + 2) == '+' && *(i + 3) == '+')
                                {
                                        i += 3;
                                }
                                else
                                {
                                        cout++;
                                        f << *i;
                                }
                                //--*ptr;
                                break;
                        case '.':
                                f << *i;
                                cout++;
                                //putchar(*ptr);
                                break;
                        case ',':
                                f << *i;
                                cout++;
                                //while ((*ptr = getchar()) == '\n') ;
                                break;
                        case '[':
                                f << *i;
                                break;
                        case ']':
                                f << *i;
                                break;
                        default:
                                //putchar(*i);
                                cout++;
                                f << *i;
                        }
                        if (cout >= 60)
                        {
                                cout = 0;
                                f << endl;
                        }
                }
                f.close();
        }


此时可以得到去混淆后的流程表 (部分流程表 下同)

[Asm] 纯文本查看 复制代码
>,>+++++++[<-------------->-][<<[>,.,[-.+[.>->,]+,-]..<],<-..]<------[<
+>[-]][+..[+,<<[>[.[[>,>,<,,]<]++]<<..>.].]],>++++++[<----------------->-][--<
[>+>[,+>[->]]][[,[<[+,].>,]<.>>]]..-]<-[<+>[-]],>++++++[<---------------->-][<+[[-,-
,>[,.,>,-]]]<-[<[>-..]>++[>[>.,[.->[>-.[>[+.>.]-<-,],][-,[.<.+[[[].<<]>-.]-<],---].+]<]+
,>->]>>]-]<-[<+>[-]][.,>-],>+++++++[<--------------->-][[-.>.]>+.[+.<[[<.[<-[>,
[>,.>[,,-[[-.+>++,-]++],>-].+>],+.>].-<.].+.],-[...+]+,]..]>.]<----[<+>[-]][.[-[,>.
[>--[[-->[.,+,,>,+]..,].>]++],.]<[>..[<[+[-<.++],-],+[<[.-.]>,.[[[>>->[[-.++]>,,]+]]],-],
],.]+]],>++++++++++[<---------->-]<-[<+>[-]],>+++++++++[<------------->
-]<------[<+>[-]],>+++++[<------------------->-][[>>,[>[+>[>>>,<+.+],[,[,+<
[.[,[+++].>,>>][[<<-[..]]-]]--<]+,],]>>],]<[[->[[+-<,+<][+.[,,[-[+[++>,-<][>>.[].],+.]<[---.,+
[,++[-,,>]->>[++<]]]<],<]+>+<+]],.-[->>[<<[<.<[,,.+.]-,>]]-<,,]]+]>,,]<--[<+>[-]][,,[+.>
->].,[.->--.<]>],>+++++++++[<------>-][>--]<---[<+>[-][.,,<.[,[.+[,[-.-[<<[+[[[<-
,,.>>]-],>,[[,<,-<,].<<]--],]<<]+]<.>-],>+[-..>>.]]>[>--[,>]>]>]]][+[,.<->][-[<.,].>+].+
+],>++++++++[<------------>-][[[.<+,,][[+,[>[-<.[-,->+,]+<,,+]>+>[--,--],+,],
]]..],]<----[<+>[-]][-.+>[+[...[<<+[<.[<[+[,,]+[,<[,<<[..>-]++[-,<,]>]-,[,[>++]<--[>+,]]]+]]-
<,]..]-[,<,[[.[>,>]>-<,.<]<+<]<]]..,,<]..<],>++++++++[<------>-]<-[<+>[-][[>>]<,[.
.,,.-]-]][-[,,..-,],[<-.[+>[++<,+[<<-[+>]+.,]],[<,-,->]..]..,<]<,.],>+++++++++[<
------>-][,]<--[<+>[-]][>>-.+,,+],>+++++++[<-------------->-]<--[<+>[-]][.+.
+,>],>++++++++[<------------>-]<------[<+>[-][++,[+[-.[.[>>+]>>[<[.>[>.>[<[--
.<.-[>.<].][>+[>]>+>>],,],[+<,[[>>>.]<+]-.-[.>.<<]]>]<+[..++[[,<[,..++>]]<,]],]-]>],[[<,[+.
->>,.].[[.,,->>>]..-[<--,,]],-<]<,]..-]].]][>[.>[,,.<[[<<-[[-,[..+<],[.-[>,].<-].].--]-]-
>+[>[-.,+.<]<<<,]]<,<]>+],],>+++++[<--------->-]<---[<+>[-][<[..[,.[[<[-,[.,.[...
-<],>+,]>,,]-],<]-]][-[+,]+<.]>]],>+++++++[<------->-][..-[>-<+[.+.<<-,],].]<--[<+
>[-][[.-.[,,[..]>].->[>[>[<,[+,[[.-,>>],<+[->>>.]+.].,]][[>,<[.+<[[.+]->,]]].-<[>[->,[,.<[.-<
[-<..-,]].+]][.-,<]+.]]],<],,-]--,[<.,<<[-,[++,,[>[>[>.[+,[[.>,++],.,]]>>[.[>,+,[,,]][<,<<
,+].+,],..][[-[+.[+.<.+>]+..[.>]>]]>[,[..<]-<],.+]]]+][>>,--]<]>].]],>+++++++++[<----->
-][.-,,>]<-------[<+>[-]],>+++++++[<-------------->-]<---[<+>[-][,.[>-<[>+.

根据第一周的题目 不能输出字符 也就是不能运行. 而当遇到[时 如果ptr指向的数据为0 那么就略过[]中间的数据 直接指向]  也就是跳过了.

这个时候 如果[]中有.  那么就可以去掉 修改一下代码

[Asm] 纯文本查看 复制代码
                        case '[':
                                ptrs = i;
                                if (1) {
                                        unmatched = 1;
                                        while (unmatched) {
                                                while (++i != buf.cend()) {
                                                        if (*i == ',' || *i == '.')
                                                        {
                                                                t = 0;
                                                        }
                                                        if (*i == '[') {
                                                                ++unmatched;
                                                                break;
                                                        }
                                                        else if (*i == ']') {
                                                                --unmatched;
                                                                break;
                                                        }
                                                }
                                        }
                                        if (t == 1)
                                        {
                                                while (ptrs != i)
                                                {
                                                        cout++;
                                                        f << *ptrs;
                                                        ptrs++;
                                                }
                                                f << *i;
                                                cout++;
                                        }
                                        t = 1;
                                }
                                break;
                        case ']':
                                ptrs = i;
                                if (1) {
                                        unmatched = 1;
                                        while (unmatched) {
                                                while (i-- != buf.cbegin()) {
                                                        if (*i == ',' || *i == '.')
                                                        {
                                                                t = 0;
                                                        }
                                                        if (*i == '[') {
                                                                --unmatched;
                                                                break;
                                                        }
                                                        else if (*i == ']') {
                                                                ++unmatched;
                                                                break;
                                                        }
                                                }
                                        }
                                        if (t == 1)
                                        {
                                                while (ptrs != i)
                                                {
                                                        cout++;
                                                        f << *ptrs;
                                                        ptrs++;
                                                }
                                                f << *i;
                                                cout++;
                                        }
                                        t = 1;
                                }
                                break;

再次运行得到

[Asm] 纯文本查看 复制代码
>,>+++++++[<-------------->-]<------[<+>[-]],>++++++[<----------------->-]
<-[<+>[-]],>++++++[<---------------->-]<-[<+>[-]],>+++++++[<--------------->-]
<----[<+>[-]],>++++++++++[<---------->-]<-[<+>[-]],>++++++++
+[<------------->-]<------[<+>[-]],>+++++[<------------------->-]
<--[<+>[-]],>+++++++++[<------>-][>--]<---,>++++++++[<------------>-]
<----[<+>[-]],>++++++++[<------>-]<-,>+++++++++[<------>-]<-
-[<+>[-]],>+++++++[<-------------->-]<--[<+>[-]],>++++++++[<------------>-]
<------,>+++++[<--------->-]<---,>+++++++[<------->-]<--,>++
+++++++[<----->-]<-------[<+>[-]],>+++++++[<-------------->-]
<---,>++++++++[<------>-]<-------[<+>[-]],>+++++[<---------->-]
<-,>+++++[<---------->-]<-[<+>[-]],>++++++++[<------>-]<,>++
+++++[<-------------->-]<,>+++++++[<------->-]<,>+++++++[<------->-]
<----[<+>[-]],>++++++++++[<---->-]<---------[<+>[-]],>++++++
++[<------------>-]<--[<+>[-]],>++++++++++[<----->-]<----[<+>[-]]
,>+++++++++[<----->-]<--------[<+>[-]],>+++++[<-------------------->-]
<[<+>[-]],>+++++[<---------->-]<--[<+>[-]],>++++++++[<------>-]
<-----[<+>[-]][+++>],>++++++++++[<----->-]<----[<+>[-]],>+++
++++[<------->-]<[<+>[-]],>+++++[<--------->-]<---[<+>[-]],>

假设单字节校验 ,表示输入字符  到下一个,表示一个环节结束 先去掉中间的[<+>[-]]

在排版一下 以 ","开头 得到

[Asm] 纯文本查看 复制代码
>,>+++++++[<-------------->-]<------
,>++++++[<----------------->-]<-
,>++++++[<---------------->-]<-
,>+++++++[<--------------->-]<----
,>++++++++++[<---------->-]<-
,>+++++++++[<------------->-]<------
,>+++++[<------------------->-]<--
,>+++++++++[<------>-][>--]<---
,>++++++++[<------------>-]<----
,>++++++++[<------>-]<-
,>+++++++++[<------>-]<--
,>+++++++[<-------------->-]<--
,>++++++++[<------------>-]<------
,>+++++[<--------->-]<---
,>+++++++[<------->-]<--
,>+++++++++[<----->-]<-------
,>+++++++[<-------------->-]<---
,>++++++++[<------>-]<-------
,>+++++[<---------->-]<-
,>+++++[<---------->-]<-
,>++++++++[<------>-]<
,>+++++++[<-------------->-]<
,>+++++++[<------->-]<
,>+++++++[<------->-]<----
,>++++++++++[<---->-]<---------
,>++++++++[<------------>-]<--
,>++++++++++[<----->-]<----
,>+++++++++[<----->-]<--------
,>+++++[<-------------------->-]<

可以发现 如果输入的字符再第一个字节 那第二个字节表示计数器

比如第一个,>+++++++[<-------------->-]<------

>+++++++[ 里边"+"的个数表示技术器的大小 也就是循环多少次

[<-------------->-]表示循环体 <-------------->表示输入的字符要减多少次

<------ "-"号个数表示输入的字符再减多少次 当执行完这个循环时候 ptr指向的数据 也就是输入的字符要为0

所以逆过来 把"-"个数加到输入数据区中就是flag  当遇到","此时初始化数据

修改脚本

[Asm] 纯文本查看 复制代码
        void Parser::execute(const std::string &buf) {
                unsigned unmatched;
                int arrays[2] = { 0, 0 };//第一个元素是数据 第二个是计数
                int ptrs = 0;//一开始指向第一个
                auto q = buf.cbegin();
                int cout = 0;// - 号计数
                for (auto i = buf.cbegin(); i != buf.cend(); ++i) {
                        switch (*i) {
                        case '>':
                                ptrs++;
                                break;
                        case '<':
                                ptrs--;
                                break;
                        case '+':
                                arrays[ptrs]++;
                                break;
                        case '-':
                                arrays[ptrs]++;
                                break;
                        case ',':
                                printf("%c", arrays[0]);
                                cout = 0;
                                arrays[0] = 0;
                                arrays[1] = 0;
                                ptrs = 0;
                                break;
                        case '[':
                                q = i;
                                while (*q != '>')
                                {
                                        if (*q == '-')
                                        {
                                                cout++;
                                        }
                                        ++q;
                                }
                                arrays[0] = arrays[1] * cout;
                                if (1) {//去到']'
                                        unmatched = 1;
                                        while (unmatched) {
                                                while (++i != buf.cend()) {
                                                        if (*i == '[') {
                                                                ++unmatched;
                                                                break;
                                                        }
                                                        else if (*i == ']') {
                                                                --unmatched;
                                                                break;
                                                        }
                                                }
                                        }
                                }
                                break;
                        }
                }
                printf("%c", arrays[0]);
                system("pause");
        }


得到

[Asm] 纯文本查看 复制代码
hgame{a9d18df034e7330b151b65d456101bd0ba0a0665bf363b634f6ab6dff875429f}


免费评分

参与人数 11吾爱币 +12 热心值 +11 收起 理由
Hotspur + 1 + 1 我很赞同!
bitpeach + 1 谢谢@Thanks!
my713533 + 1 + 1 谢谢@Thanks!
gink + 1 + 1 热心回复!
zhukai055 + 2 + 1 谢谢@Thanks!
T_T + 1 + 1 我很赞同!
kaypukaypu + 1 + 1 用心讨论,共获提升!
lihaohua + 1 + 1 谢谢@Thanks!
度娘灬魂手 + 1 + 1 谢谢@Thanks!
梦游枪手 + 2 + 1 谢谢@Thanks!
luoluoovo + 1 + 1 谢谢@Thanks!

查看全部评分

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

绿闪石 发表于 2019-3-14 09:51
我看了标题兴冲冲的正准备下载呢,点进来是一篇天书!
xulavigne 发表于 2019-3-14 11:22
绿闪石 发表于 2019-3-14 09:51
我看了标题兴冲冲的正准备下载呢,点进来是一篇天书!

我也以为是破解了某社的新作
不过楼主是真的厉害
寻觅背影 发表于 2019-2-10 13:37 来自手机
sdlylz 发表于 2019-2-10 14:57
hgame?名字不要乱用
 楼主| 姚小宝 发表于 2019-2-10 15:12
sdlylz 发表于 2019-2-10 14:57
hgame?名字不要乱用

? 名字就是hgame网络攻防大赛
A3uRa 发表于 2019-2-10 21:47
yechen123 发表于 2019-2-10 15:12
? 名字就是hgame网络攻防大赛

23333,ctf比赛 他是说hgame这个名字有内涵,楼主很纯洁
duck0123 发表于 2019-3-5 16:37
感谢楼主分享~~
liub103 发表于 2019-3-7 12:32
看起来好强大的样子
softx3k 发表于 2019-3-14 11:17
新手学习了,谢谢楼主的无私分享
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则 警告:本版块禁止灌水或回复与主题无关内容,违者重罚!

快速回复 收藏帖子 返回列表 搜索

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-3-29 16:59

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表