[FE-CTF 2022: Cyber Demon ] snake-jazz

外国人想法真是不一样,连着遇上两个手剥题,先看题

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里会有空格和引号,不过提交还是对了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值