前回の続きです。

ここに私が解いた過程を残していこうと思います。

picoCTFのリンク

https://play.picoctf.org/practice


33. MacroHard WeakEdge (正答率59%/高評価68%)

パワーポイントのファイルが与えられる。
開くと修復しますかとか出てきて修復すると開け、Not a flagとか37枚目のスライドに書いてある。
とりあえずバイナリで見てみる。
するとシグネチャがPKであった。
あれ?PKってzipファイルじゃなかったっけ?と思っていたら、PKはいろんなファイルにも使われているらしい。
とりあえず拡張子を.zipにして開くと開けた。
するとスライドとかのファイルがたくさん入っていた。
xmlファイルとかで{}が多用されており、めちゃくちゃフラグっぽいものがあったがそうではなかった。
テキトーにフォルダを開いていると、hiddenという隠しファイルがあった。
中身を見ると
Z m x h Z z o g c G l j b 0 N U R n t E M W R f d V 9 r b j B 3 X 3 B w d H N f c l 9 6 M X A 1 f Q
なんか意味深な文字列が並んでいた。
rot13をしても意味はなかったが、base64をしたらフラグゲット。

34.New Caesar (31%/57%)

pythonで独自の暗号化がされたフラグが渡される。
pythonのエンコードのコードを読む。
試しに実行してみると
   assert all([k in ALPHABET for k in key])
AssertionError
エラーが出ました。
なんかassertという文がある。
調べるとassertの条件式が偽だとエラーが出るというデバッグ用の関数だそうです。
allという関数は中身がすべて真だと真を返し、偽が1つでもあると偽を返します。
allの中身を見てみるとリスト内包表記が二重になっていてわかりにくいです。
python苦手なのでまずfor文を復習します。
for k in key はkeyから1個ずつ取り出してkに代入し、処理をkeyの要素数行うというものです。
k in ALPHABET はkがALPHABETに含まれていれば真を返します。
ということはkeyの中身がALPHABETに含まれていればエラーが出ないということです。
その部分を読むと、
flag = "redacted"
key = "redacted"
assert all([k in ALPHABET for k in key])
assert len(key) == 1
redactedは訂正という意味であるため、変えてという意味です。
そして2つのassert文があり、1つ目は先ほどの通りで、2つ目はkeyの長さは1文字にしろとのことです。
ALPHABET = string.ascii_lowercase[:16]
ascii_lowercase[:16]は小文字のアルファベットのaからpの16文字分のリストです。
その後
b16 = b16_encode(flag)
enc = ""
for i, c in enumerate(b16):
enc += shift(c, key[i % len(key)])
print(enc)
b16