【write-up】SECCON BeginnersCTF【[Rev]ghost】

前書き

SECCON BeginnersCTFから既に一週間近くが経過してしまいましたが、未だに後追いをしています。やらなきゃいけないこと、やりたいこと等山積ですが、のんびりやっていきたいと思います。あと、個人的な感想ですが、この問題はReversingというよりかはMisk感の方があったかなぁと言う気がします。

write-up

よく分からないソースコードと出力ファイルが渡される。written by a ghost 👻とのことで、調べてみるとGhostscriptのようである。gsコマンドで実行できるので、実行し、ctf4b{と入力してみる。 f:id:yamanobori_programing:20200601181940p:plain
output.txtの先頭部分と一致する。以下、一致する文字をブルートフォースで探索するスクリプトを作成し実行する。

import subprocess

cmd='gs chall.gs'
flag='ctf4b{'
echo='echo'
strBase='_!$%&0123456789@ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz}'
decLaw=[]

FILE=open('output.txt','rt')
dec=FILE.read()
FILE.close()

decLaw=dec.split(' ')

for i in range(len(decLaw)-7):
    for j in range(len(strBase)):
        flagTmp=flag+strBase[j]

        run1=subprocess.Popen(cmd,shell=True,stdin=subprocess.PIPE,stdout=subprocess.PIPE)
        run2=subprocess.Popen([echo,flagTmp],stdin=subprocess.PIPE,stdout=run1.stdin)
        output=run1.stdout.read().decode('utf-8')
        
        output=output.split('\n')
        tmp=output[4].split(' ')
        if( decLaw[:len(tmp)-1]==tmp[:-1] ):
            flag+=strBase[j]
            print(flag)
            break
        run1.kill()
        run2.kill()

subprocessを用いることで新にプロセスを生成したり、入力やその出力結果を取得することが出来る。詳しくはドキュメントを参照。このスクリプトを動かすとflagを得る。
ctf4b{st4ck_m4ch1n3_1s_4_l0t_0f_fun!}