外国人想法真是不一样,连着遇上两个手剥题,先看题
import sys,os
class X(object):
def __init__(x,a=0,b=0,c=0):
x.a=a
x.b=b or ~-a
x.c=c
def __invert__(x):
x.c-=x.c
return X(x.a,x.b,x.c)
def __pow__(x, y):
x=~x
x.a*=y
x.b*=y
x.c+=3
return x
def __pos__(x):
x**=3
x.b=-~x.b
return x
def __neg__(x):
x**=3
return x
def __or__(x, y):
y**=(~x).a
y.b+=x.b
return y
def __add__(x, y):
return x|+y
def __sub__(x, y):
return x|-y
def __del__(x):
if not x.c: return
y=[0]*9
while 3**y[8]<x.a:
z=x.b//3**y[8]%3**7
y[8]+=7
a=z//3**4
b=z//9%9
c=z%9
d=c+x.b//3**y[8]%3**7*3*3
if a==0:
os._exit(0)
elif a==1:
y[8]+=7
y[b]=d
elif a==2:
y[b]=y[c]
elif a in(3,8):
y[b]=x.b//3**y[c]%3**(3*3)
if a==8:
y[c]+=9
y[c]%=3**9
elif a in(4,6,7):
if a==6:
y[8]+=7
b,c,d=8,7,d or y[b]
if a>4:
y[c]-=9
y[c]%=3**9
x.b+=y[b]*3**y[c]-x.b//3**y[c]%3**9*3**y[c]
if a==6:
y[8]=d
elif a==5:
if y[b]:
y[8]=d
else:
y[8]+=7
pass
elif 9<=a<=12:
y[b]={
9:lambda a,b:a<b,
10:lambda a,b:(a+b)%3**9,
11:lambda a,b:(a*b)%3**9,
12:lambda a,b:(a-b)%3**9,
}[a](y[b],y[c])
elif 13<=a<=15:
e,f=0,y[c]
for _ in range(9):
e*=3
e+={
13:lambda a,b:~(a+b)%3,
14:lambda a,b:min(a,b),
15:lambda a,b:max(a,b),
}[a](y[b]%3,f%3)
y[b]//=3
f//=3
for _ in range(9):
y[b]*=3
y[b]+=e%3
e//=3
elif a==16:
y[b]=y[b]*3**c%3**9
elif a==17:
y[b]=y[b]//3**c
elif a==18:
y[b]=ord(sys.stdin.read(1))
elif a==19:
sys.stdout.write(chr(y[b]));sys.stdout.flush()
else:
0/0
for i in range(1, 100):
setattr(sys.modules['__main__'],'_'*i,X(3**i))
这是一个对象,对象内部重载了符号,这和C++上一个意思,很容易理解。在最后把把‘_’不同长度的下划线定义成对象。这个有一点绕但也不难,就是遇到一连串的下划看就作为一个对象处理,初始化变量就是3**i
再看主程序
#!/usr/bin/env python3
import magic;_+___+---+---+-__+++-+_-_+_++_++++-+-_+_++_-__-_-+++-++---\
_+_+-+++-+--++__-++___++++_-+_-+__+-+++_-+-_-_-_+_+++-_+--++-_+_-+_---_\
+_-+--_-++_+_--_--+_++_+__-++-+_++--+__+__++-___++_+_--__-_-__--+--_-_-\
--++__-+-____-_+++-_++---+-__+++++_+-+++-___+_++-__-_--_-_-_--+-+++--_-\
_++______++-+-++_++-_-_+-+-_+++_--__--___-+_+++-++_+-++_-+-+-_+--_++-_-\
-++---+__+_____+__--+_--+++__+--+_+--+___-+++++++_+-+_++_-_+-+__-_++++-\
+-__+_++____+_-+-+-+__+-+_-+--_+++__----++-++-+__+-+----__-+_++__+++_-+\
+_+--+--__--+_++__+--++_+-_-_++-_-+-_+_+__++-++_+++++-__+_---+_+_+-+-__\
++-----++-+--_-_++__+--__++-___-_+-+__+-+__+_---_+++_--+-+-+_++_-+++__+\
+-_--+++++--_+_++_--_-+___-___+++-_++++-++-+_++-++_-+++++_+-__---_-_--_\
-+_-+-__+_--+++_-__+_+_-+-++---+_+-+-+__+++_----_-+_-+-+_-++___---++-__\
+-+_+_+--_+---+++--++__+_-+----_--_+_-+_-+_+-+---++_+++-+_+_____----+-+\
++-+__+--_++--_-___+_+_-+--_++--+++__--+_+_-+_-----+_+_+-___+++-+__-+__\
-+___++-++_+___-+-_+_-_----_--+_+_-___+_____-_+_+_-+--+__-_+++-_-++__-_\
+++-__--++-+++_+_+__+--___-+-_--_-++-+-+-_+ +_++++___--+__-+_--__+_-__+\
____---___++++-+_-+__---__++-++-+-__-+-_-++_----_+-+_+_-__+_+____-_+---\
_+--+-_+----_+--++___--__-+-_-+++-+--_+_+__-+_--++-----+++_-_-+_+_-+-+-\
---+_+-+++__+++_-_--_-+_-+++_-++____--++-__+++_+_+--_----+++--_+__+_-+-\
_--_--_+_++_-+_+-+_--++_+++++_+______---+-+++++__+--_+---_-___+-+_-+--_\
+---+++__-++_+_-++_+---+_+_+-+__+++-+_--_-+___-+_-++__+_+_++-_-___++---\
+_-__-++_+_+----_+_-++___--__+--_-++++++_-++-+-_--++-___-+_+_+--++---++\
+---+__+_-+-+--_--_+__+_-+_+-++--++_+++_+_+_____+---+-+++_+__+--_+_--_-\
___+++_-+--_+_--+++__-_+_+_-++_----+_+-__+__+++-___-_-+_+_-_+-_-+_-+__+\
+-++--_-__+__--_+-+-_+_-__+---_-+_-_+_--___+--+-___+_+_+-+___--+++-++-+\
_+_-+_+++_-+-__+--+_-++-++_++_-+-+---++--+-+__+_+--_--_--_++_+_-+_+-_+-\
-++_+++-+_+_____----+-+++-+__+--_++--_-___+_+_-+--_++--+++__--+_+_-++__\
---+_+_+_+__++++_+--_-+__+_-_-++__-_+-__+_-_---_++_+_-+_--__-+---++-_+-\
++_+_+-+-+---+++_- -+__+_-_+-_-_-- _++-++-_+--_----_-++_-___-++____-++-\
___-_++_+_-_+__--+-+-+_--___+++_+___--_-___++_-_+_-+__+-+-_++-+_+_-__-+\
---+__--------_+_-_--+_____---_+_-+--_+___+++----___-_+_-+-_--++++_-_+_\
+_-+_-+__-++_-+_-_-_-+_-_+-___-_-__+++_-___-__--__+_+-++_--___+-_+++-_-\
_+-+++_++-------_--_+++++_+__-_+_+-__+-+-_-+--_-+_----+------+_+-+-__+-\
--+--+--+__+-++++--_-___-++_-+--___--+++__--+_+_-++__---+_+_+_+__+++-+-\
--_-+____+_-++_-_+--++-_+__+_+_+-+++---+++_-_+__+_-_++--_--_++_-_-+_+-_\
++-__----_--_+_++_-+_--+++-_--+++_--++_+_-++-+_--+_+++__+_+++_+_-__-_-_\
+_+------++--+-+-_-++_+--+++----++-_-++__+_++----_--_---+_-+_++-+--++_+\
--_+_+___-__---+-+-+-+__+-------_-__+_++_-+---__--+++_++_+_+_-+_-_---+_\
+++++__+++++---_-+_+_++_-++_-+-+_++-__++-++---+__++--_++-+---__+_---__-\
__++-+----+_-_+-+-+-+__---+++-+-+__+_-+__--_--_+_++_-+_+-+_--++_+++++_+\
______---+-+++++__+--_+---_-___+-+_-+--_+_+_+++__-++-+-_-_+++--_-++__+-\
+-_-_+_+--_-++_++-+-_-_+-+--_-++_-+-+-_-_+++--_-++__+-+-_-_+_+--_-++_++\
-+-_-_+-+--_-++_-+-+-_-_+++--_-++__+-+-_-_+_+--_-++_++-+-_-_+-+--_-++_-\
+-+-_-_+++--_-++__+-+-_-_+_+--_-++_++-+-_-_+-+--_-+_--+++-_-+_+--_-+__+\
_+_-++_-----++-_+_-+_+_+-++----+++_--+__+_-_+---_--_-+-+_-+_++__--++_++\
-+-_+____-++-++++__-+_-+_-_++-+____+___-__-___-_-+-+__+---++_---++_+-+-\
++_+_-+--_-_-+__++__+_-__++--+_-+---++_--++-+--++_+--__-_+_-++-----+__-\
_____-___++_+_-+-_+++_--+++-++++_+-_++-++_-+___+--+____+-__-__-__+-_-+-\
+__----++_--_-+_+-+-____--+--_++-+_+-__-_++_--+-+_--+_+_+-++_+++--++---\
+_-_-_+__++__- _--_-+_+__+_-++_--+--++-_-_- +_+_+---__--++++_-_+_+_-+_+\
___-++_--_-++-_---_++_+_-_-__--+-_-__--___+-__+___-++____+ +_---_-+__++\
___++-+_+-___-+--+_+_------+-_+_-_-+_-____---_-_-+--___-_+++---++__-_+_\
+___--++++___+_+_-+_____-++_-__-++-_--+_++_+_-____--+-_--_--___+-+_+___\
-+-_+__++_--++-_-+_+----_+_+-__+_--++___--+++_+__+_+_-+-_-_--+_+-+__+_+\
++_++___-_-+_+_-++_-+-+_++__+-_+-+---+-+_-+_+---+--+_---+_+++_+-_--__-+\
_+-_+__++- _-+__+_-+__+_---++_+-__-_+___++++-+++++++_--+_-++-_+_++-+__+\
__-__-_+--_-+-_+--_-+++-+++-__+-_--_-_++_+-+_+--_+__++_+_--------+_+_-+\
-__++++-_+--__-+-__-+-++-+-_+++__+--+_-__++-+_-++++-___++_-_-+--_--_+_-\
-+-_-_-_+---_++_+--+_--__--_--++-_-___++_+--++_+_+---_--+_--+-+_++-++++\
+_---_-_+_++__-+-__++__-_--+-_+-+_+-_-__+-+_-_-+-_++_---_-_+-_++-++---+\
_-_---_++++--__--_++-----_++_+-___--_-_+--+_-++-_-+----_-++++-+____-_--\
___-_+-_+-+-_+_++_++___--++--__++_+__+-_--+__-+_+-_++--+_+--+_+-_-+-_++\
+__+-+-+_-+-+-_--++__-__+_+_++---__-+_+-++---++__+--+--+_-_+_+-+_-__---\
+--+_++__+-++__--_-__+_-_+-+--+-+_+-+++-+--++-_---+++++-++_---_--_++-_+\
-+_++_-++-+_+-_+---__-+_++__-_-+----_-+-_+++_-+++_-_--++-_-+++_+_+-_+--\
--++++-_+__+_------_--___++_-+_+__+--++_+_-++_+___++_---+-+_+++__+--+__\
--_-__-+-+_-+--+-+--+++_--_+_+_-+------+_+++_-__+++__+_--__-_+__+___+_-\
-___++-____-+____-__++-+-+_+__-+-+_+__----+-_+_+_-_++_-____-++_--_+---_\
-_+---__+----+-_+_-+_++-_---+--___++-__+-+++_-+_+-+-_-_+__+----++_-_+_-\
____+--+-_+-__+_+--+__-_--_+-+_+-_+-+++__++_+-___-___++-__+-+_+_-___+-+\
_--__-_++__-__+--_+-++__+_--++-_-_-+_+--_+-_-+_-___++-+-_-_-__+_+---+-+\
-___++++--+--_--_--_-+_+_-+_++_---++_+-__+_+____++---+-+-+-+__+--_++--_\
-__++++_-+--_+_--+++_+-++_+_-++_----+_+++++__+++--_+__-+_-_--+-+-+__+_-\
+--___+_-__----+_+-++_+____+-_+_-__-_+-+_++_+-------__+__+_+-_-_-___+-_\
+-__++_+__++++++__-__-_-_-_+-++++_+__+-_-_+-_-_+---+__+---_---__ +__---\
__-_-_+_-__+-__--+-__+++-____-__-+-_+_+-++--_+__+-___-__-_+-_-___+---+_\
-_-_+___+-++-++++-__---+_-+--+__++_--+--_-+_++_+_-++_-_++_++-___+-++---\
-_-++--_++_+---__+_--+__-__--++__-+-+_++--+-+_+--++--_---++--__+-+---__\
++_++__-__+++--_-+--+_+_-++++__--++-_+_-+_+_+-++----+++_--+__+_-_+---_-\
-_-+-+_-+_++__--++_+--++_+___-_----+-+-+_+__+----+--_-__+_-+_-+---_---+\
++_++-_++_-+_----_+++__++_-_-___+--++-_-__+_+_+--_----+++_+-+__+_--+-+-\
_--__+---_+-++--+_----__+--++__-+-+_+__++++---+-+---+__+---+_--_-__+_++\
_-+---__--+++_++_+_+_-+_-_---+_+++++__+++--_+__-+_-_--+-+-++__+++--_-+_\
--_--__+-+_-+_+++_--++_+_-_+_+___-__---+-+_+-+__+----+--_-__-_++_-+----\
_--+++_-+++_+_-+_-----+_+-+_+__+++++_--_-+__-_+_-++_+-_--++-___++_+_+-+\
__+--+++---+-+-+___-_--+++---_-_+_-+_+-_+___++-__-+_++_-_+-+++++----+-_\
++++__++_+__+__-+_--_---+-+--_++_++-+-_+-_+_-+-_--_-+___++_--_--+-+_++-\
_-_++-+---+-+---__--_--__-+--__+---+-_+++-+--+_+-_--+_-++-_-_++-_-___+_\
-+-+-_+__++_----++_-++-_++-+---+_-__-__++_-+-+_--+-+++_-+-__+-__++_+_++\
+++--+--_-_-_+-_+--++_--_---___+--_-+---+++_++-++_-+-+------+--__-+_--+\
+--++_-_---_-_-___-+-+_-+-+-+--_+-_+_-+--+_-___++--___-++_+___+-+_+++--\
--+_++-__+_+_-__+_-+--+-_+-___-_-+++__+___-+-+-+___+-+-+-++----+-_+_-++\
+++_++-_++__-_-___---+_++--+__+_-+_+-__--_+-++-_--+---+__+-+___-+-+++-_\
+_-+-_-+++-___++++++__+++-_-+--+-_+-_+-+--_--++--__-+_--++--+-+_-+--_-+\
_++-++++__----_-_--+++_--++__--_+__-_++_-_____+-_+++++--_--_-_--__+--+-\
-+__-__+_++-+--+--------_-+---------_+-++----+---++-_+-+---++_--_++++++\
_-++++-+--_+--+-+-+-+-_---_++_-_+--+_+_+_+-_--_++_+--_-+---_+--+-------\
_+-+-+-__-+-++--__---+-_--++_-__+--_+---+--___+--------+-+_+++++_-_-+--_
是程序里其实就是程序,这个相当于一个虚拟机,把下划线看作对象,加减号是重载的运算。然后这些对象运算。
这些运算其实只是数据,没有其它东西。主逻辑在对象的析构函数,当程序完成,对象销毁时运行。
这样,只需要把__del__里边的东西拿出来运行就能知道他在干啥了。
while 3**y[8]<x.a:
z=x.b//3**y[8]%3**7
y[8]+=7
a=z//3**4
b=z//9%9
c=z%9
d=c+x.b//3**y[8]%3**7*3*3
print(y,a,b,c,d) #<---- 将命令取出
得到数据如下
[0, 6647, 6633, 6630, 0, 0, False, 19656, 161] 18 4 0 3267 18为输入,下一行y[4]为输入值
[0, 6647, 6633, 6630, 102, 0, False, 19656, 168] 4 4 3 1146 102 f
[0, 6647, 6633, 6630, 102, 0, False, 19656, 175] 1 5 1 10
[0, 6647, 6633, 6630, 102, 10, False, 19656, 189] 12 4 5 3983
[0, 6647, 6633, 6630, 92, 10, False, 19656, 196] 5 4 1 217
[0, 6647, 6633, 6630, 92, 10, False, 19656, 224] 1 5 0 9
[0, 6647, 6633, 6630, 92, 9, False, 19656, 238] 10 3 5 1148
[0, 6647, 6633, 6639, 92, 9, False, 19656, 245] 1 5 1 1
[0, 6647, 6633, 6639, 92, 1, False, 19656, 259] 10 0 5 4307
[1, 6647, 6633, 6639, 92, 1, False, 19656, 266] 5 8 1 154
[1, 6647, 6633, 6639, 92, 1, False, 19656, 161] 18 4 0 3267
[1, 6647, 6633, 6639, 108, 1, False, 19656, 168] 4 4 3 1146 108 l
[1, 6647, 6633, 6639, 108, 1, False, 19656, 175] 1 5 1 10
[1, 6647, 6633, 6639, 108, 10, False, 19656, 189] 12 4 5 3983
[1, 6647, 6633, 6639, 98, 10, False, 19656, 196] 5 4 1 217
[1, 6647, 6633, 6639, 98, 10, False, 19656, 224] 1 5 0 9
[1, 6647, 6633, 6639, 98, 9, False, 19656, 238] 10 3 5 1148
[1, 6647, 6633, 6648, 98, 9, False, 19656, 245] 1 5 1 1
[1, 6647, 6633, 6648, 98, 1, False, 19656, 259] 10 0 5 4307
[2, 6647, 6633, 6648, 98, 1, False, 19656, 266] 5 8 1 154
[2, 6647, 6633, 6648, 98, 1, False, 19656, 161] 18 4 0 3267
[2, 6647, 6633, 6648, 97, 1, False, 19656, 168] 4 4 3 1146
[2, 6647, 6633, 6648, 97, 1, False, 19656, 175] 1 5 1 10
[2, 6647, 6633, 6648, 97, 10, False, 19656, 189] 12 4 5 3983
[2, 6647, 6633, 6648, 87, 10, False, 19656, 196] 5 4 1 217
[2, 6647, 6633, 6648, 87, 10, False, 19656, 224] 1 5 0 9
[2, 6647, 6633, 6648, 87, 9, False, 19656, 238] 10 3 5 1148
[2, 6647, 6633, 6657, 87, 9, False, 19656, 245] 1 5 1 1
再结合对象(虚拟机),命令18表示读入数据(读入时会先检查头和长度是否正确,所以这里运行时要输入一个样子很正确的fake),在所有18结束后12读入正确的flag进行对比
18结束后 12开始对比
[6333, 6630, 0, 102, 102, 102, False, 19656, 371] 12 5 4 11146 102 f
[6333, 6630, 0, 102, 102, 0, False, 19656, 378] 15 2 5 10490
[6333, 6630, 0, 102, 102, 0, False, 19656, 385] 14 3 4 3964
[6333, 6630, 0, 102, 102, 0, False, 19656, 392] 5 3 8 413
[6333, 6630, 0, 102, 102, 0, False, 19656, 420] 1 5 0 9
[6333, 6630, 0, 102, 102, 9, False, 19656, 434] 10 0 5 7421
[6342, 6630, 0, 102, 102, 9, False, 19656, 441] 10 1 5 4307
[6342, 6639, 0, 102, 102, 9, False, 19656, 448] 5 8 1 343
[6342, 6639, 0, 102, 102, 9, False, 19656, 350] 3 3 0 2520
[6342, 6639, 0, 108, 102, 9, False, 19656, 357] 3 4 1 1891
[6342, 6639, 0, 108, 108, 9, False, 19656, 364] 2 5 3 9192
[6342, 6639, 0, 108, 108, 108, False, 19656, 371] 12 5 4 11146 108
[6342, 6639, 0, 108, 108, 0, False, 19656, 378] 15 2 5 10490
[6342, 6639, 0, 108, 108, 0, False, 19656, 385] 14 3 4 3964
[6342, 6639, 0, 108, 108, 0, False, 19656, 392] 5 3 8 413
[6342, 6639, 0, 108, 108, 0, False, 19656, 420] 1 5 0 9
[6342, 6639, 0, 108, 108, 9, False, 19656, 434] 10 0 5 7421
[6351, 6639, 0, 108, 108, 9, False, 19656, 441] 10 1 5 4307
[6351, 6648, 0, 108, 108, 9, False, 19656, 448] 5 8 1 343
[6351, 6648, 0, 108, 108, 9, False, 19656, 350] 3 3 0 2520
[6351, 6648, 0, 97, 108, 9, False, 19656, 357] 3 4 1 1891
[6351, 6648, 0, 97, 97, 9, False, 19656, 364] 2 5 3 9192
[6351, 6648, 0, 97, 97, 97, False, 19656, 371] 12 5 4 11146 97
[6351, 6648, 0, 97, 97, 0, False, 19656, 378] 15 2 5 10490
[6351, 6648, 0, 97, 97, 0, False, 19656, 385] 14 3 4 3964
然后拿着这很长很长的数据把12拉红,然后手工写出flag
flag{it's, it's a device Morty!}
一开始都不相信flag里会有空格和引号,不过提交还是对了。