0
1

More than 3 years have passed since last update.

SECCON Beginners CTF 2020 Writesup

Last updated at Posted at 2020-05-25

SECCON Beginners CTF2020に参加したのでWritesupを記載します
スコアサーバー
https://score.beginners.seccon.jp/challenges

Welcome

welcome.png
問題文に記載がある通り、SECCON BeginnersのDiscord チャンネルにアクセスするとフラグがある。

welcome_flag.png

FLAG:ctf4b{sorry, we lost the ownership of our irc channel so we decided to use discord}

emoemoencode

絵文字を基にフラグを推定する。
最初の3文字がctfに変換されると仮定して、絵文字を数字に変換すると以下のようになる(pythonのordを使用)
🍣 127843 ⇔ c 99
🍴 127860 ⇔ t 116
🍦 127846 ⇔ f 102
となるように、絵文字を数字に変換後、127744を引いたものを再度英字に変換するとフラグが取得できる。

回答コード

question="🍣🍴🍦🌴🍢🍻🍳🍴🍥🍧🍡🍮🌰🍧🍲🍡🍰🍨🍹🍟🍢🍹🍟🍥🍭🌰🌰🌰🌰🌰🌰🍪🍩🍽"
result=""

for q in question:
   result=result+chr(ord(q) -127744)

print(result)

FLAG:ctf4b{stegan0graphy_by_em000000ji}

mask

ファイルをダウンロード後、実行すると以下のように使い方が示される

./mask 
Usage: ./mask [FLAG]
./mask  a
Putting on masks..
a
a
Wrong FLAG. Try again

正しいフラグを入力するとクリアできるようだ
該当ファイルをIDA もしくはgidra で開くと、以下の2つを満たす文字列であることが分かる

1.引数で渡した文字列と0x75の文字列との論理和を取得し、その結果が"atd4`qdedtUpetepqeUdaaeUeaqau"となること
2.引数で渡した文字列と0xebの文字列との論理和を取得し、その結果が"c`b bk`kj`KbababcaKbacaKiacki"となること

mask.png

回答コード

v1="atd4`qdedtUpetepqeUdaaeUeaqau"
v2="c`b bk`kj`KbababcaKbacaKiacki"
result=""

for i in range(len(v1)):

 count=0x00
 while(1):
  result_v1= chr(0x75 & count)
  result_v2= chr(0xeb & count)
  if result_v1 == v1[i] and result_v2==v2[i]:
   result=result+chr(count)
   break
  else:
   count=count+1

print(result)

ctf4b{dont_reverse_face_mask}

Spy

実在する従業員を特定できればフラグが得られるようだ。
与えられたコードを確認すると、
1.従業員のIDがDB内に存在しないと、エラーを返す
2.従業員のIDがDB内に存在するならば、パスワードのハッシュを計算してあっていないとエラーを返す


   if not exists:
            return render_template("index.html", message="Login failed, try again.", sec="{:.7f}".format(time.perf_counter()-t))

        # auth.calc_password_hash(salt, password) adds salt and performs stretching so many times.
        # You know, it's really secure... isn't it? :-)
        hashed_password = auth.calc_password_hash(app.SALT, password)
        if hashed_password != account.password:
            return render_template("index.html", message="Login failed, try again.", sec="{:.7f}".format(time.perf_counter()-t))

ご丁寧にも実行にかかった時間を出力するようなコードが記載されているので、存在する従業員の場合には時間がかかることが仮定される。従業員のIDをすべて入力し、かかった時間が多い従業員のみ特定すると以下のフラグが得られた。
ctf4b{4cc0un7_3num3r4710n_by_51d3_ch4nn3l_4774ck}

R&B

ダウンロードしたファイルを確認すると、暗号化した結果と方式が記載されたファイルが渡される。
方式に関しては、
1.FORMATの文字列がRの場合、FLAG文字列をROT13したもの先頭にRを付与する
2.FORMATの文字列がBの場合、FLAG文字列をBASE64したもの先頭にBを付与する
3.それ以外の場合、何もしない

なので復号するときは逆をすればよく、以下を暗号化された文字列に適用する。
1.FLAGの文字列の先頭がRの場合、Rを取り除き、残りをROT13する
2.FLAGの文字列の先頭がBの場合、Bを取り除き、残りをBASE64する

ctf4b{rot_base_rot_base_rot_base_base}

感想

最低限の人権は得られたが。
個人的にはCryptの問題に少し手をつけたかったが

0
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
1