ファイルを解凍すると、encrypt.pyとencrypted.pngができます。pngファイルは壊れていて表示できません。バイナリエディタで確認すると、そもそもPNG形式ではないようです。次にencrypt.pyプログラムの処理を確認します。処理は次のようになります。Magic Image
100
We found this png, but it seems to be encrypted...
Can you decrypt it?
- flag.pngを開いて全データを読み込み
- add_pad関数で、データサイズが12の倍数になるようにそろえる
- 12の倍数に足りない分だけデータの最後に文字を付加する
- 付加する文字は足りないバイト数をASCIIコードとして文字にしたもの
- keyファイルを開いて全データ読み込み
- flag.pngのデータを12バイトずつ7と8の処理を繰り返す
- flag.pngの12バイトとkeyのxorをとった結果を暗号文とする
- 暗号文に追加する
- 暗号文をencrypted.pngファイルに書き出す
89 50 4E 47 0D 0A 1A 0Aですので、これとkeyの先頭8バイトとのXORの結果が、encrypted.pngの先頭8バイト、
8A 6F 2B 52 7B E0 3F B6にならなければいけません。さらに、PNGシグネチャの次のIHDRチャンクの先頭4バイトは、
00 00 00 0Dですので、keyの9~12バイトとのXORの結果が、
2A D3 B5 00になるはずです。以上により、key12バイトは
03 3f 65 15 76 ea 25 bc 2a d3 b5 0dになります。これをkeyファイルとして保存し、encrypted.pngをflag.pngに名前を変えてencrypted.pyのopen関数の部分をバイナリで読むように修正して実行します。下図の通り、encrypted.pngファイルができます。

フラグは、
TUCTF{st@llowning_xOR_5ince_Apollo}です。









