SECCON Beginners CTF2020に参加したのでWritesupを記載します
スコアサーバー
https://score.beginners.seccon.jp/challenges
Welcome
問題文に記載がある通り、SECCON BeginnersのDiscord チャンネルにアクセスするとフラグがある。
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"となること
回答コード
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の問題に少し手をつけたかったが