BSidesTLV 2020 CTF Writeup

この大会は2020/6/28 15:00(JST)~2020/6/30 15:00(JST)に開催されました。
今回もチームで参戦。結果は500点で124チーム中42位でした。
自分で解けた問題をWriteupとして書いておきます。

TheTarget (Misc 100)

$ file TheTarget
TheTarget: Extensible storage engine DataBase, version 0x620, checksum 0xbb95e8e9, page size 8192, Windows version 6.3

ESEDatabaseViewで開いてみる。databaseテーブルをHTML出力してみる。"BSides"で検索すると、何か所かあるが、その中からフラグが見つかった。

BSIDESTLV2020{ThisGoesDeeper}

Check yourself so you won't wreck yourself (Forensics 100)

FTK Imagerで開き、Basic data partitionを見る。[root]-[$Recycle.Bin]-[S-1-5-21-3498983559-1615527653-2205644034-1001]配下にたくさんのファイルがある。この中にtxtファイル($R0K6T9B.txt)があり、フラグが書いてあった。

BSIDESTLV{ICanSeeYouUnlessYouCleanUpAfterYourself}

MoreWithLess (Forensics 200)

Autopsyで開き、ウェブ検索を見ると、フラグが見つかった。
f:id:satou-y:20200707220314p:plain

BSIDESTLV2020{HideYourNeedleInTheHayStack}

Basis32 (Crypto 100)

ヘブライ語でbase32エンコードらしきものが書いてある。問題文のソースを見るとUnicodeが書いてあるので、書きだす。

\u05d8\u05d9\u05d9\u05e6\u05e2\u05e9\u05d3\u05d5\u05de\u05dd\u05da\u05d4\u05e8\u05e5\u05e1\u05e2\u05d6\u05d0\u05e9\u05d3\u05d06\u05ea\u05de\u05dd53\u05e56\u05e2\u05da7\u05da\u05e5\u05e7\u05d6\u05d8\u05e9\u05db\u05e2\u05de\u05dd\u05ea\u05d6\u05d23\u05e3\u05d4\u05db5\u05d4\u05d665\u05ea7\u05d8\u05d9\u05e0\u05e7\u05d6\u05e9\u05d9\u05e3\u05d6\u05d9\u05df\u05e4\u05d23\u05d3\u05d7\u05dd5\u05e9\u05d6\u05e25\u05d3\u05d8\u05dd\u05e5\u05df\u05e5\u05de33\u05e2\u05dd\u05dd\u05e9\u05e7\u05ea===

フラグは"BSidesTLV"から始まるので、base32エンコードを見てみる。

>>> import base64
>>> base64.b32encode('BSidesTLV')
'IJJWSZDFONKEYVQ=

このことからコードで\u05d0を起点にアルファベットを割り当てる。インデックス26は数値の始まりである'2'を割り当てる。あとはbase32デコードを行う。

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

chars = string.ascii_uppercase + '2'

ct = '\u05d8\u05d9\u05d9\u05e6\u05e2\u05e9\u05d3\u05d5\u05de\u05dd\u05da\u05d4\u05e8\u05e5\u05e1\u05e2\u05d6\u05d0\u05e9\u05d3\u05d06\u05ea\u05de\u05dd53\u05e56\u05e2\u05da7\u05da\u05e5\u05e7\u05d6\u05d8\u05e9\u05db\u05e2\u05de\u05dd\u05ea\u05d6\u05d23\u05e3\u05d4\u05db5\u05d4\u05d665\u05ea7\u05d8\u05d9\u05e0\u05e7\u05d6\u05e9\u05d9\u05e3\u05d6\u05d9\u05df\u05e4\u05d23\u05d3\u05d7\u05dd5\u05e9\u05d6\u05e25\u05d3\u05d8\u05dd\u05e5\u05df\u05e5\u05de33\u05e2\u05dd\u05dd\u05e9\u05e7\u05ea==='

b32 = ''
for c in ct:
    code = ord(c)
    if code >= 0x05d0:
        index = code - 0x05d0
        b32 += chars[index]
    else:
        b32 += c
print(b32)

pt = base64.b32decode(b32)
print(pt)

実行結果は以下の通り。

IJJWSZDFONKEYVRSGAZDA62ON53V6SK7KVXGIZLSON2GC3TEL5EG6527IJQXGZJTGJPUC3DHN5ZGS5DINVPVO33SNNZX2===
b'BSidesTLV2020{Now_I_Understand_How_Base32_Algorithm_Works}'
BSidesTLV2020{Now_I_Understand_How_Base32_Algorithm_Works}