Magic Image

100

We found this png, but it seems to be encrypted...

Can you decrypt it?

ファイルを解凍すると、encrypt.pyとencrypted.pngができます。pngファイルは壊れていて表示できません。バイナリエディタで確認すると、そもそもPNG形式ではないようです。次にencrypt.pyプログラムの処理を確認します。処理は次のようになります。
  1. flag.pngを開いて全データを読み込み
  2. add_pad関数で、データサイズが12の倍数になるようにそろえる
  3. 12の倍数に足りない分だけデータの最後に文字を付加する
  4. 付加する文字は足りないバイト数をASCIIコードとして文字にしたもの
  5. keyファイルを開いて全データ読み込み
  6. flag.pngのデータを12バイトずつ7と8の処理を繰り返す
  7. flag.pngの12バイトとkeyのxorをとった結果を暗号文とする
  8. 暗号文に追加する
  9. 暗号文をencrypted.pngファイルに書き出す
PNGフォーマットの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ファイルができます。

encrypted

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