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]
except IndexError: it = ("asgnlit",-1,-1)
if it == "diepgrm":
sys.exit()
if it == "pointer":
mem]=mem.get(mem.get(it,0),0)
if it == "randomb":
mem]=random.randint(True,False)
if it == "asgnlit":
mem]=it
if it == "jumpif>" and mem.get(it,0) > 0:
mem[-1]=it
if it == "applop+":
mem]=mem.get(it,0)+mem.get(it,0)
if it == "applop-":
mem]=mem.get(it,0)-mem.get(it,0)
if it == "applop/":
mem]=mem.get(it,0)/mem.get(it,0)
if it == "applop*":
mem]=mem.get(it,0)*mem.get(it,0)
if it == "echovar":
sys.stdout.write(unichr(mem.get(it,0)))
if it == "echoval":
sys.stdout.write(str(mem.get(it,0)))
if it == "inputst":
inp = sys.stdin.readline()
for k in range(it,it+len(inp)):
mem=ord(inp])
mem=0
i = i+1运行得到flag:
页:
[1]