打开看到一堆猫猫的图片。
hackim_2019_misc_cat
这个实际上用到了unicat编程语言,可以把字符串转换成表情。
可以通过这个项目里的cat.py来还原。
尝试还原:
$ python cat.py final
[('inputst',1),('diepgrm',),('asgnlit', 1, 1),('asgnlit', 4, 1),('asgnlit', 10, 7),('echoval', 2),('pointer',4,4),('echoval',4),('applop+', 10, 1),('echoval',10),('asgnlit', 2, 72),('applop*', 2, 10),('echoval',2),('asgnlit', 0, 108), ('echovar', 0),('asgnlit', 0, 108), ('echovar', 0),('asgnlit', 0, 65), ('echovar', 0),('asgnlit', 0, 119), ('echovar', 0),('asgnlit', 0, 69), ('echovar', 0),('asgnlit', 0, 115), ('echovar', 0),('asgnlit', 0, 48), ('echovar', 0),('asgnlit', 0, 109), ('echovar', 0),('asgnlit', 0, 69), ('echovar', 0),('asgnlit', 0, 95), ('echovar', 0),('asgnlit', 0, 67), ('echovar', 0),('asgnlit', 0, 64), ('echovar', 0),('asgnlit', 0, 84), ('echovar', 0)]
这些得到的只是指令,要创建一个脚本来自动解码。这里面开头的inputst是等待输入,diepgrm是终止并退出,所以要把这两个删除,不然永远卡住跑不出结果。
构造decode.py来解密:
import sys,random
ins=[('asgnlit', 1, 1),('asgnlit', 4, 1),('asgnlit', 10, 7),('echoval', 2),('pointer',4,4),('echoval',4),('applop+', 10, 1),('echoval',10),('asgnlit', 2, 72),('applop*', 2, 10),('echoval',2),('asgnlit', 0, 108), ('echovar', 0),('asgnlit', 0, 108), ('echovar', 0),('asgnlit', 0, 65), ('echovar', 0),('asgnlit', 0, 119), ('echovar', 0),('asgnlit', 0, 69), ('echovar', 0),('asgnlit', 0, 115), ('echovar', 0),('asgnlit', 0, 48), ('echovar', 0),('asgnlit', 0, 109), ('echovar', 0),('asgnlit', 0, 69), ('echovar', 0),('asgnlit', 0, 95), ('echovar', 0),('asgnlit', 0, 67), ('echovar', 0),('asgnlit', 0, 64), ('echovar', 0),('asgnlit', 0, 84), ('echovar', 0)]
mem= {}
i = 0
while i<37:
mem[-1]=mem.get(-1,-1)+1
try: it = ins[mem[-1]]
except IndexError: it = ("asgnlit",-1,-1)
if it[0] == "diepgrm":
sys.exit()
if it[0] == "pointer":
mem[it[1]]=mem.get(mem.get(it[1],0),0)
if it[0] == "randomb":
mem[it[1]]=random.randint(True,False)
if it[0] == "asgnlit":
mem[it[1]]=it[2]
if it[0] == "jumpif>" and mem.get(it[1],0) > 0:
mem[-1]=it[2]
if it[0] == "applop+":
mem[it[1]]=mem.get(it[1],0)+mem.get(it[2],0)
if it[0] == "applop-":
mem[it[1]]=mem.get(it[1],0)-mem.get(it[2],0)
if it[0] == "applop/":
mem[it[1]]=mem.get(it[1],0)/mem.get(it[2],0)
if it[0] == "applop*":
mem[it[1]]=mem.get(it[1],0)*mem.get(it[2],0)
if it[0] == "echovar":
sys.stdout.write(unichr(mem.get(it[1],0)))
if it[0] == "echoval":
sys.stdout.write(str(mem.get(it[1],0)))
if it[0] == "inputst":
inp = sys.stdin.readline()
for k in range(it[1],it[1]+len(inp)):
mem[k]=ord(inp[k-it[1]])
mem[k+1]=0
i = i+1
运行得到flag:
hackim_2019_misc_cat
|