この大会は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!}