EKOPARTY CTF 2017: Shopping

,

まさかhelloworld出力して終わりとは思わなかった。悲しい。

problem

Welcome to EKOPARTY!と出力するmalbolgeのプログラムを書け。

solution

http://shinh.hatenablog.com/entry/20121210/1355068468 これを読んで探索する。

$ nc malbolge.ctf.site 40111
Send a malbolge code that print: 'Welcome to EKOPARTY!' (without single quotes)
ba&%$#8=~}4{WDxfAut+qqL'[email protected]<_z\\[6YXm!UT0RglOwvL'fIHcFa`_^]\[[email protected]]~6Z43Wx0Tu-Qr*Non&Jk#"Fg}C{[email protected]<]sr8Yo5VUk1Rh.Oe+Lb(`_%F\"CB}j
Running code...
Welcome to EKOPARTY!
Your flag is: EKO{0nly4nother3soteric1anguage}

implementation

#!/usr/bin/env python3
import malbolge  # https://github.com/kmyk/malbolge-interpreter/blob/be70bf495b16044c07a50c3bfa8e391805637aa7/a.py
import queue
import io

def decrypt1(code):
    return ''.join(malbolge.decrypt1(i, c) for i, c in enumerate(code))
def run(code):
    code = decrypt1(code)
    inf = io.BytesIO(b'')
    outf = io.BytesIO()
    malbolge.execute(code.encode(), inf=inf, outf=outf)
    return outf.getvalue()

target = b'Welcome to EKOPARTY!' # => ba&%$#8=~}4{WDxfAut+qqL'[email protected]<_z\\[6YXm!UT0RglOwvL'fIHcFa`_^]\[[email protected]]~6Z43Wx0Tu-Qr*Non&Jk#"Fg}C{[email protected]<]sr8Yo5VUk1Rh.Oe+Lb(`_%F\"CB}j

que = queue.deque()
que.append({ 'data': '', 'code': '' })
def to_code(obj):
    return 'i' + obj['data'] + 'o' * (98 - len(obj['data'])) + obj['code'] + 'v'
for i in range(len(target)):
    while que:
        obj = que.popleft()
        obj['output'] = run(to_code(obj))
        print(obj)
        if obj['output'] == target[: i + 1]:
            que = queue.deque()
            que.append(obj)
            break
        elif obj['output'] == target[: i]:
            for d in 'ji*p</vo':
                for c in '*p<':
                    que.append({ 'data': obj['data'] + d, 'code': obj['code'] + c })
print(to_code(obj))
print(decrypt1(to_code(obj)))