[日本語] [English]

poly

ファイル flag.png が与えられた。

ImageMagickidentify -verbose コマンドで調べると、以下の出力がされた。

identify: IDAT: Extra compressed data `for-poly\flag.png' @ warning/png.c/MagickPNGWarningHandler/1748.

TweakPNGでチェックしたところ、今回の flag.png には IDAT チャンクが1個しかないことがわかった。
そこで、CyberChefの Drop bytes でヘッダを取り除き、Zlib Inflate を行った。
その結果、7,079,040バイトのデータが得られ、これはIHDRチャンクの値から計算できる大きさと同じだった。

展開後のデータには余計なデータは無いようなので、展開前のデータを調べることにした。
Zlib Inflate の前に Drop bytes を追加してデータの最後を削り、Zlib Inflate がエラーにならない最小の Start の値を探した。
その結果、45370 まではエラーにならないことがわかった。

Drop bytes, Drop bytes, Zlib Inflate - CyberChef

そこで、この Drop bytes を Take bytes に変え、この無くても Zlib Inflate がエラーにならない部分のデータを取り出した。

Drop bytes, Take bytes - CyberChef

取り出したデータをVLC media playerで開いてみると、約4秒の音声が再生され、文字が読み上げられていた。
これらの文字を書き起こし、FLAG{} を加えることで、flagが得られた。

FLAG{thisismpng3}

writeup by MikeCAT

WaniCTF 2021