本帖最后由 yechen123 于 2019-2-9 20:11 编辑
题目
第二周.rar
(26.02 KB, 下载次数: 37)
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查看文件格式
发现前面的格式都没有错
而从第二行的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的位置指令码出错了
估计是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}
|