2022年1月から2月にかけて開催されていた、picoCTFの初心者向けMiniCTFのWriteUPです。
内容はほぼPythonの問題で難易度初心者向けで全然難しくなかったですが、せっかく全答できたので書き残しておきます。
runme.py

Pythonスクリプトをダウンロードして実行するだけ。実行環境が出来てない人はこの機会に入れたら良いと思う。

ncme

ncコマンドを実行。コマンド入ってない人は入れる。ポート番号は毎回変わります。

convertme.py

スクリプトをダウンロードして実行してみる。
If 83 is in decimal base, what is it in binary base?
10進数の83は2進数でいくつ?ことなので答えを求める。ついでなのでその計算にもPython使った。

回答を入力する

Codebook

同じディレクトリにcode.pyとcodebook.txtを置いた状態でcode.pyを実行する。

fixme1.py

シンタックスエラーを直せということなので1回ダウンロードして実行してみる。

エラーメッセージを読めという話。
IndentationError: unexpected indent
20行目のインデントを直す(中途半端にインデントになってるところを消す)

改めて実行する

fixme2.py

1と同じようにダウンロードして実行してみる。

エラーメッセージを読もうという話(2回め)
SyntaxError: invalid syntax
22行目の比較演算子が間違ってるので直す

実行する

PW Crack 1

ダウンロードしてきたファイルを同じディレクトリに入れて実行するとパスワードを聞かれる。正解するとフラグがもらえる。

level1.pyを開くと普通に書いてあった

入力するだけ

Glitch Cat

ncコマンドで接続してみる

フラグの後半を文字に直す必要があるので、私はCyberchef使いました。自分で計算しても良いと思うけどツールでどうにかなるところは楽しちゃう派です。

PW Crack 2

1と同じようにパスワードを聞かれるので、level2.pyの中身を見る。18行目。

上の問題と同じようにCyberchef使っちゃった

どうでもいいけどパスワードの内容が意味のない文字列だと合ってるのか不安になるな。
HashingJobApp

最高のハッシュが欲しいか…?(いや別に欲しくはない)とりあえず接続してみる


3回ハッシュ値を求める質問が繰り返されて、これスクリプト組まないとダメなやつか…?と不安になったところでフラグが出てきた。よかった。

Serpentine

Pythonスクリプトをダウンロードしてきて実行してみる。

ソースコードを見なさいよと言われたので見る。
20行目にptint_flag関数はあるのに68行目のbを選んでも実行されるようになってない。


書き直す

実行してbを選ぶとフラグが出る

PW Crack 3

問題文より、パスワードの候補が7つあるとのことなのでスクリプトの内容を確認してみる。

スクリプト書き変えてもいいけど7つくらいなら総当りしたほうが早い。最初のやつがフラグ(解ければ手段は選ばない派)

PW Crack 4

前問からパスワードの候補が100個に増えたバージョン。level4.pyスクリプトを確認してみる。

できなくはないだろうけど流石に手動で総当りは大変なのでスクリプトをてきとうに以下のように書き換える(一部抜粋)
def level_4_pw_check():
pos_pw_list = ["b5e5", "71ff", "acaf", "390c", "1a9b", "e7e2", "a35c", "fafd", "b759", "5eba", "6506", "d5ce", "2df5", "476b", "ca78", "8797", "821c", "28e7", "2bcb", "7906", "6c2a", "734e", "ad9a", "7acd", "6c65", "8d90", "6c81", "b3a8", "bfac", "d96e", "8d45", "b365", "2bf7", "bec9", "25c8", "c716", "1854", "75d0", "9084", "a891", "e863", "d754", "5486", "d652", "a529", "af06", "2b97", "3e5c", "6c7d", "9d26", "5db7", "69cc", "e304", "94cf", "e7c9", "67c7", "df95", "8858", "9319", "b91e", "1ff8", "ed2e", "9628", "70ba", "2ea8", "a5d8", "d59b", "a0c6", "2f25", "f7ba", "db04", "c53f", "e2f7", "bf10", "1392", "ff42", "31d4", "edab", "5bea", "dd25", "32e6", "980e", "8286", "23e8", "4379", "88cc", "de9a", "92dd", "4922", "7c82", "c054", "6587", "e655", "5c39", "ab8c", "29b3", "443c", "31f9", "fbff", "a08f"]
index = 0
len_list = len(pos_pw_list)
while index < len_list:
user_pw_hash = hash_pw(pos_pw_list[index])
decryption = str_xor(flag_enc.decode(), pos_pw_list[index])
print(index,end = ":")
print(decryption)
index = index + 1
実行すると38番目で結果がいい感じになる。多分もっといい書き方があると思うけど気にしない。

PW Crack 5

辞書ファイルが与えられてそこにフラグがある。辞書ファイルはこんな感じ、パスワードのパターンが増えて65535通りってことだと思われる。

パスワードチェック部分のスクリプトはこんな感じ

なのでこれを利用して書き換える(コード一部抜粋)
def level_5_pw_check():
with open('dictionary.txt') as f:
lines = f.read()
for l in lines.split("\n"):
user_pw_hash = hash_pw(l)
if( user_pw_hash == correct_pw_hash ):
print("Welcome back... your flag, user:")
decryption = str_xor(flag_enc.decode(), l)
print(decryption)
return
実行するとフラグが出てくる

まとめ
今回不慣れなPython読んだり書いたりしたので参考にさせていただいた書籍はこちらです。独習ってだけあってめちゃわかりやすく書いてある。ありがたい。
picoCTFは初心者向けCTFとして超おすすめなのでみんなやろう!