SCTF 2021 Writeup

この大会は2021/12/25 18:00(JST)~2021/12/27 18:00(JST)に開催されました。
今回もチームで参戦。結果は133点で206チーム中145位でした。
自分で解けた問題をWriteupとして書いておきます。

This_is_A_tree (Misc)

Treeでdataファイルが格納されていて、base64データになっている。

- [Top]: Q2hp
-- letf: bmVz
--- letf: ZSB0
---- letf: cmFk
----- letf: aXRp
------ letf: b25
------ Right: hbCB
----- Right: jdWx
------ letf: 0dXJ
    :
$ echo Q2hpbmVzZSB0cmFkaXRpb25hbCBjdWx0dXJ= | base64 -d
Chinese traditional cultur

letfを優先して文字列を連結する。パスを配列にすると以下のようなイメージ

['',     '',     '',     '',      ''     ]
['letf', '',     '',     '',      ''     ]
['letf', 'letf', '',     '',      ''     ]
['letf', 'letf', 'letf', '',      ''     ]
['letf', 'letf', 'letf', 'letf',  ''     ]
['letf', 'letf', 'letf', 'letf',  'letf' ]
['letf', 'letf', 'letf', 'letf',  'Right']
['letf', 'letf', 'letf', 'Right', ''     ]
['letf', 'letf', 'letf', 'Right', 'letf' ]
['letf', 'letf', 'letf', 'Right', 'Right']

5個の深さで'', 'letf', 'Right'の優先順位でソートし、''の下に'letf'や'Right'のパターンを除けばよい。連結したデータをbase64デコードする。

#!/usr/bin/env python3
import itertools
import base64

def get_path(arry):
    sp = False
    path = ''
    stat = True
    for i in range(len(arry)):
        if arry[i] == '':
            sp = True
        elif sp == True:
            path = ''
            stat = False
        else:
            path += arry[i]
            path += '/'
    return stat, path + 'data'

dir = ['', 'letf', 'Right']

b64 = ''
for v in itertools.product(dir, repeat=5):
    res, path = get_path(v)
    if res:
        with open(path, 'r') as f:
            b64 += f.read()

msg = base64.b64decode(b64).decode()
print(msg)

実行結果は以下の通り。

Chinese traditional culture is broad and profound! So I Want Give You My Flag But You Need Decode It.Enjoy The Flag!!:师 兑 复 损 巽 震 晋 姤 大过 讼 噬嗑 震 恒 节 豫

以下のサイトを参考にし、()の中の数値を元にデコードする。

https://zh.wikipedia.org/wiki/%E5%85%AD%E5%8D%81%E5%9B%9B%E5%8D%A6
https://www.codetd.com/ja/article/6538243

base64のテーブルは以下の通り。

          111111111122222222223333333333444444444455555555556666
0123456789012345678901234567890123456789012345678901234567890123
ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/

0始まりのインデックスとして、文字にしていく。

大过 噬嗑
index 16 54 32 49 27 36 05 31 30 23 37 36 28 50 04
char Q 2 g x b k F f e X l k c y E

この文字列をbase64デコードする。

$ echo Q2gxbkFfeXlkcyE= | base64 -d
Ch1nA_yyds!
SCTF{Ch1nA_yyds!}