Hgame Ctf write up
本帖最后由 yechen123 于 2019-2-9 20:11 编辑题目
Hgame 第二周的逆向题
0x00 Pro的Python教室(二)
下载压缩包是一个pyc文件
直接用uncompyle6反编译成py文件
uncompyle6 -o secend.py secend.pyc
得到py代码
# 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)
# 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) + 1))
else:
enc1.append(chr(ord(enc) + 2))
s1 = []
for x in range(3):
for i in range(len):
if (i + x) % 3 == 0:
s1.append(enc1)
enc2 = enc2.join(s1)
if enc2 in aaa:
print "You 're Right!"
else:
print "You're Wrong!"
exit(0)
可以编写解密脚本
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] = u
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) - 1))
else:
flags+=(chr(ord(flag) - 2))
print flags
得到flag
hgame{Now_Y0u_got_th3_PYC!}
0x01 maze
用IDA打开
发现Check函数
_BOOL8 __fastcall Check(const char *a1)
{
char v2; //
int i; //
int v4; //
v4 = strlen(a1);
for ( i = 0; i < v4; ++i )
{
v2 = Setmap(a1);
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函数
__int64 __fastcall Setmap(char a1)
{
__int64 result; // rax
char v2; //
unsigned __int64 v3; //
__int64 savedregs; //
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;
}
可以看到一些奇怪的字符串应该是迷宫题
对于迷宫题 得到迷宫 并且得到迷宫的行列大小 方向控制键 还有人物初始位置 就可以非常快解题了
从代码发现
result = *((unsigned __int8 *)&savedregs + 60 * y_2973 + ++x_2974 - 1152);
迷宫列数应该是60 方向控制键是asdw
可以得到迷宫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
wwwwaaaaaaaaaaaaaasssssssssssssssddddddddddddddwwwwwwwaaaaaaaaaaaa
0x02 ShinyShot!
IDA打开 发现
int __cdecl sub_4017AA(char a1)
{
char *Str; // ST20C_4
char *MaxCount; //
int DstBuf; //
__int16 v5; //
int v6; //
CHAR Filename; //
char Str1; //
char Buf; //
unsigned int cout; //
FILE *v11; //
char *v12; //
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);
Buf = 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函数
BOOL __cdecl sub_401460(unsigned int cout)
{
DWORD flOldProtect; //
unsigned int v3; //
unsigned int v4; //
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函数的时候应该压入栈的参数没有入栈
.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,
.text:004018EB 89 44 24 04 mov , eax ; char *
.text:004018EF 8D 45 A4 lea eax,
.text:004018F2 89 04 24 mov , 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表示偏移
也就是
0x15 = 0x4018F5 - 0x4018DE - jmp指令长度(2字节)
我们要跳到 loc_4018E5 也就是
0x5 = 0x4018e5-0x4018de-0x2
所以 输入数字最低三位应该等于四也就是100
而要修改的字节的地址是0x4018DF 所以 除了前面几位应该是0x8DF
也就是 (0x8df<<3) + 0x4 = 18172
再看sub_4014FA函数
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; //
size_t v10; //
int j; //
signed int i; //
int v13; //
v13 = 0;
v9 = 4 * strlen(Str) / 3;
for ( i = 0; i < v9; ++i )
{
if ( i & 3 )
{
if ( i % 4 == 1 )
{
v3 = 16 * Str & 0x30;
v4 = v13++;
a2 = byte_405020 >> 4)];
}
else
{
if ( i % 4 == 2 )
{
v5 = 4 * Str & 0x3C;
v6 = v13++;
v7 = byte_405020 >> 6)];
}
else
{
v7 = byte_405020 & 0x3F];
}
a2 = v7;
}
}
else
{
v2 = v13++;
a2 = byte_405020[(char)(Str >> 2)];
}
}
if ( strlen(Str) % 3 == 1 )
{
a2 = byte_405020 & 0x30];
a2 = 61;
a2 = 61;
}
else if ( strlen(Str) % 3 == 2 )
{
a2 = byte_405020 & 0x3C];
a2 = 61;
}
a2 = 0;
v10 = strlen(a2);
for ( j = 0; ; ++j )
{
result = v10 - 1;
if ( (signed int)(v10 - 1) <= j )
break;
a2 ^= a2;
}
return result;
}
是一个base64加密不过字母表改变了 而且最后加多了一层异或
再看下边的函数
GetModuleFileNameA(0, &Filename, 0x104u);
v11 = fopen(&Filename, "rb");
fseek(v11, -32, 2);
fread(&DstBuf, 0x20u, 1u, v11);
fclose(v11);
从文件最后32位抽出来跟加密后数据对比
把这32位异或得到
DnY0m19iAgArMKjSP2Uvme8wOzb0iD==
在经过base64解密可以从网上套脚本 也可以自己写
#include <stdio.h>
#include <stdlib.h>
#include <windows.h>
int main(void)
//18172
{//, 'i', 'D', '=', '='
char en_asc = {'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 == asciis)
break;
}
for(cout2=0;;cout2++)
{
if(en_asc==asciis)
break;
}
for(cout3=0;;cout3++)
{
if(en_asc==asciis)
break;
}
for(cout4=0;;cout4++)
{
if(en_asc==asciis)
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查看一下哪里出错了
>>> 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) + ')',
IndexError: tuple index out of range
>>>
发现应该是偏移为13的位置指令码出错了
估计是0x64太大了可以改成0x48
后边想了一个下午也没能反编译成py文件 但是能dis出来指令了 只能硬看指令了
找不到好的解释文档 只能半猜半解
>>> 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
对于 >> 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加密
64 LOAD_CONST 4 ('FcjTCgD1EffEm2rPC3bTyL5Wu2bKBI9KAZrwFgrUygHN')
应该就是密文了
再看
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解密出来
得到解密脚本
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)
print flag
h = ""
for i in range(len(flag)):
if (i%2==0):
flag += 1
else:
flag -= 1
h += chr(flag)
print h
flag
hgame{W3lc0me_To_anothe2_Python!}
0x04 brainfxxker's revenge
题目直接给一个C++源代码
#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 = {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 '['和']'表示跳跃
先改一下代码 去混淆 把+- -+ ++----++ <> 这样的字符去掉
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();
}
此时可以得到去混淆后的流程表 (部分流程表 下同)
>,>+++++++[<-------------->-][<<[>,.,[-.+[.>->,]+,-]..<],<-..]<------[<
+>[-]][+..[+,<<[>[.[[>,>,<,,]<]++]<<..>.].]],>++++++[<----------------->-][--<
[>+>[,+>[->]]][[,[<[+,].>,]<.>>]]..-]<-[<+>[-]],>++++++[<---------------->-][<+[[-,-
,>[,.,>,-]]]<-[<[>-..]>++[>[>.,[.->[>-.[>[+.>.]-<-,],][-,[.<.+[[[].<<]>-.]-<],---].+]<]+
,>->]>>]-]<-[<+>[-]][.,>-],>+++++++[<--------------->-][[-.>.]>+.[+.<[[<.[<-[>,
[>,.>[,,-[[-.+>++,-]++],>-].+>],+.>].-<.].+.],-[...+]+,]..]>.]<----[<+>[-]][.[-[,>.
[>--[[-->[.,+,,>,+]..,].>]++],.]<[>..[<[+[-<.++],-],+[<[.-.]>,.[[[>>->[[-.++]>,,]+]]],-],
],.]+]],>++++++++++[<---------->-]<-[<+>[-]],>+++++++++[<------------->
-]<------[<+>[-]],>+++++[<------------------->-][[>>,[>[+>[>>>,<+.+],[,[,+<
[.[,[+++].>,>>][[<<-[..]]-]]--<]+,],]>>],]<[[->[[+-<,+<][+.[,,[-[+[++>,-<][>>.[].],+.]<[---.,+
[,++[-,,>]->>[++<]]]<],<]+>+<+]],.-[->>[<<[<.<[,,.+.]-,>]]-<,,]]+]>,,]<--[<+>[-]][,,[+.>
->].,[.->--.<]>],>+++++++++[<------>-][>--]<---[<+>[-][.,,<.[,[.+[,[-.-[<<[+[[[<-
,,.>>]-],>,[[,<,-<,].<<]--],]<<]+]<.>-],>+[-..>>.]]>[>--[,>]>]>]]][+[,.<->][-[<.,].>+].+
+],>++++++++[<------------>-][[[.<+,,][[+,[>[-<.[-,->+,]+<,,+]>+>[--,--],+,],
]]..],]<----[<+>[-]][-.+>[+[...[<<+[<.[<[+[,,]+[,<[,<<[..>-]++[-,<,]>]-,[,[>++]<--[>+,]]]+]]-
<,]..]-[,<,[[.[>,>]>-<,.<]<+<]<]]..,,<]..<],>++++++++[<------>-]<-[<+>[-][[>>]<,[.
.,,.-]-]][-[,,..-,],[<-.[+>[++<,+[<<-[+>]+.,]],[<,-,->]..]..,<]<,.],>+++++++++[<
------>-][,]<--[<+>[-]][>>-.+,,+],>+++++++[<-------------->-]<--[<+>[-]][.+.
+,>],>++++++++[<------------>-]<------[<+>[-][++,[+[-.[.[>>+]>>[<[.>[>.>[<[--
.<.-[>.<].][>+[>]>+>>],,],[+<,[[>>>.]<+]-.-[.>.<<]]>]<+[..++[[,<[,..++>]]<,]],]-]>],[[<,[+.
->>,.].[[.,,->>>]..-[<--,,]],-<]<,]..-]].]][>[.>[,,.<[[<<-[[-,[..+<],[.-[>,].<-].].--]-]-
>+[>[-.,+.<]<<<,]]<,<]>+],],>+++++[<--------->-]<---[<+>[-][<[..[,.[[<[-,[.,.[...
-<],>+,]>,,]-],<]-]][-[+,]+<.]>]],>+++++++[<------->-][..-[>-<+[.+.<<-,],].]<--[<+
>[-][[.-.[,,[..]>].->[>[>[<,[+,[[.-,>>],<+[->>>.]+.].,]][[>,<[.+<[[.+]->,]]].-<[>[->,[,.<[.-<
[-<..-,]].+]][.-,<]+.]]],<],,-]--,[<.,<<[-,[++,,[>[>[>.[+,[[.>,++],.,]]>>[.[>,+,[,,]][<,<<
,+].+,],..][[-[+.[+.<.+>]+..[.>]>]]>[,[..<]-<],.+]]]+][>>,--]<]>].]],>+++++++++[<----->
-][.-,,>]<-------[<+>[-]],>+++++++[<-------------->-]<---[<+>[-][,.[>-<[>+.
根据第一周的题目 不能输出字符 也就是不能运行. 而当遇到[时 如果ptr指向的数据为0 那么就略过[]中间的数据 直接指向]也就是跳过了.
这个时候 如果[]中有.那么就可以去掉 修改一下代码
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;
再次运行得到
>,>+++++++[<-------------->-]<------[<+>[-]],>++++++[<----------------->-]
<-[<+>[-]],>++++++[<---------------->-]<-[<+>[-]],>+++++++[<--------------->-]
<----[<+>[-]],>++++++++++[<---------->-]<-[<+>[-]],>++++++++
+[<------------->-]<------[<+>[-]],>+++++[<------------------->-]
<--[<+>[-]],>+++++++++[<------>-][>--]<---,>++++++++[<------------>-]
<----[<+>[-]],>++++++++[<------>-]<-,>+++++++++[<------>-]<-
-[<+>[-]],>+++++++[<-------------->-]<--[<+>[-]],>++++++++[<------------>-]
<------,>+++++[<--------->-]<---,>+++++++[<------->-]<--,>++
+++++++[<----->-]<-------[<+>[-]],>+++++++[<-------------->-]
<---,>++++++++[<------>-]<-------[<+>[-]],>+++++[<---------->-]
<-,>+++++[<---------->-]<-[<+>[-]],>++++++++[<------>-]<,>++
+++++[<-------------->-]<,>+++++++[<------->-]<,>+++++++[<------->-]
<----[<+>[-]],>++++++++++[<---->-]<---------[<+>[-]],>++++++
++[<------------>-]<--[<+>[-]],>++++++++++[<----->-]<----[<+>[-]]
,>+++++++++[<----->-]<--------[<+>[-]],>+++++[<-------------------->-]
<[<+>[-]],>+++++[<---------->-]<--[<+>[-]],>++++++++[<------>-]
<-----[<+>[-]][+++>],>++++++++++[<----->-]<----[<+>[-]],>+++
++++[<------->-]<[<+>[-]],>+++++[<--------->-]<---[<+>[-]],>
假设单字节校验 ,表示输入字符到下一个,表示一个环节结束 先去掉中间的[<+>[-]]
在排版一下 以 ","开头 得到
>,>+++++++[<-------------->-]<------
,>++++++[<----------------->-]<-
,>++++++[<---------------->-]<-
,>+++++++[<--------------->-]<----
,>++++++++++[<---------->-]<-
,>+++++++++[<------------->-]<------
,>+++++[<------------------->-]<--
,>+++++++++[<------>-][>--]<---
,>++++++++[<------------>-]<----
,>++++++++[<------>-]<-
,>+++++++++[<------>-]<--
,>+++++++[<-------------->-]<--
,>++++++++[<------------>-]<------
,>+++++[<--------->-]<---
,>+++++++[<------->-]<--
,>+++++++++[<----->-]<-------
,>+++++++[<-------------->-]<---
,>++++++++[<------>-]<-------
,>+++++[<---------->-]<-
,>+++++[<---------->-]<-
,>++++++++[<------>-]<
,>+++++++[<-------------->-]<
,>+++++++[<------->-]<
,>+++++++[<------->-]<----
,>++++++++++[<---->-]<---------
,>++++++++[<------------>-]<--
,>++++++++++[<----->-]<----
,>+++++++++[<----->-]<--------
,>+++++[<-------------------->-]<
可以发现 如果输入的字符再第一个字节 那第二个字节表示计数器
比如第一个,>+++++++[<-------------->-]<------
>+++++++[ 里边"+"的个数表示技术器的大小 也就是循环多少次
[<-------------->-]表示循环体 <-------------->表示输入的字符要减多少次
<------ "-"号个数表示输入的字符再减多少次 当执行完这个循环时候 ptr指向的数据 也就是输入的字符要为0
所以逆过来 把"-"个数加到输入数据区中就是flag当遇到","此时初始化数据
修改脚本
void Parser::execute(const std::string &buf) {
unsigned unmatched;
int arrays = { 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++;
break;
case '-':
arrays++;
break;
case ',':
printf("%c", arrays);
cout = 0;
arrays = 0;
arrays = 0;
ptrs = 0;
break;
case '[':
q = i;
while (*q != '>')
{
if (*q == '-')
{
cout++;
}
++q;
}
arrays = arrays * cout;
if (1) {//去到']'
unmatched = 1;
while (unmatched) {
while (++i != buf.cend()) {
if (*i == '[') {
++unmatched;
break;
}
else if (*i == ']') {
--unmatched;
break;
}
}
}
}
break;
}
}
printf("%c", arrays);
system("pause");
}
得到
hgame{a9d18df034e7330b151b65d456101bd0ba0a0665bf363b634f6ab6dff875429f}
我看了标题兴冲冲的正准备下载呢,点进来是一篇天书!{:1_907:} 绿闪石 发表于 2019-3-14 09:51
我看了标题兴冲冲的正准备下载呢,点进来是一篇天书!
我也以为是破解了某社的新作;www
不过楼主是真的厉害 谢谢分享 hgame?名字不要乱用 sdlylz 发表于 2019-2-10 14:57
hgame?名字不要乱用
? 名字就是hgame网络攻防大赛 yechen123 发表于 2019-2-10 15:12
? 名字就是hgame网络攻防大赛
23333,ctf比赛 他是说hgame这个名字有内涵,楼主很纯洁{:301_1000:} 感谢楼主分享~~ 看起来好强大的样子 新手学习了,谢谢楼主的无私分享