[watevrCTF 2019]Ancient Script

知识点

莎士比亚语言

正如伟大的诗人兼剧作家莎士比亚曾经写道:“世界上所有的节目,所有的男人和女人都只是变数。”

好吧,也许这不是他写的,但这是对Shakespeare编程语言的精确总结。
Shakespear的设计目标是使源代码像莎士比亚戏剧。 剧中的角色是变数。 如果你想分配一个角色,比如说哈姆雷特,一个负值,你把他和另一个角色放在舞台上,并让这个角色羞辱哈姆雷特。
输入和输出是通过让某人告诉一个角色来倾听他们的心声并说出他们的想法来完成的。。
该语言包含条件,角色询问对方的问题,跳转,他们决定去哪些具体的行为或场景。
如何编译运行:
方法一:尝试下载编译作者提供的spl与c的转换器,然后把莎士比亚语言翻译成c语言运行
http://shakespearelang.sourceforge.net/
方法二:在线编译器
https://apex.oracle.com/pls/apex/f?p=25672:1:101141278806306:::::
方法三:本地python库

题目

拿到题目,经历一番百度和谷歌后,找到了上述三种编译运行的方法,但是没有一种方法能把题目给出的脚本运行出来
于是我去github上的题库把题目重新下载了一遍 https://github.com/wat3vr/watevrCTF-2019
尝试运行了一下solve.py

#做了一点修改
import requests
from bs4 import BeautifulSoup
import subprocess
import os

#flag = input()

print("patching spl program...")
f = open("attachment")
code = f.read()
f.close()

index1 = code.index(" II.")
index2 = code.index("Juliet:\nRemember me.")
code = list(code)
code = code[: index2 - 2] + list(" Speak your mind.") + code[index2 - 2 :]
code = code[: index1 + 4 - 27] + code[index1 + 4 :]
patched_code = "".join(code)

f = open("patched.spl", "w")
f.write(patched_code)
f.close()

print("running spl program...")
p = subprocess.Popen(["./compile_and_run.sh", "patched.spl"], stdout=subprocess.PIPE)
recovered_flag = p.communicate()[0].decode()

os.remove("patched.spl")
print(recovered_flag)
#if recovered_flag == flag:
#    print("correct flag!")
#else:
#    print('flag missmatch "%s" "%s"' % (recovered_flag, flag))
#    exit(1)

打开patched.spl看了一下,终于发现了之前忽略的地方

根据语法规则,We must return to scene II是跳转回了第二幕,也就是形成了一个死循环
Speak your mind是输出,相当于print,没有这个程序不会输出
所以要把死循环删掉,在加上一个输出语句

posted @ 2023-01-09 23:15  云千  阅读(229)  评论(0)    收藏  举报