poly

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

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

A file flag.png was given.

Investigating the file using identify -verbose command from ImageMagick, it produced this output:

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 まではエラーにならないことがわかった。

Checking with TweakPNG, I found that this flag.png contains only one IDAT chunk.
Seeing this, I used CyberChef to remove the header via "Drop bytes" and to apply "Zlib Inflate".
This resulted in 7,079,040 bytes of data. This size is the same as the expected size calculated from values in the IHDR chunk.

Finding that the extracted data doesn't have extra part, I moved to investigate data before extracting.
I added "Drop bytes" before "Zlib Inflate" to remove the last part of data and searched for the minimum value of "Start" that doesn't make "Zlib Inflate" throw an error.
As a result, I found that it doesn't cause error until the value becomes less than 45370.

Drop bytes, Drop bytes, Zlib Inflate - CyberChef

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

After that, I replace this "Drop bytes" with "Take bytes" to extract this data removing which doesn't make "Zlib Inflate" throw an error.

Drop bytes, Take bytes - CyberChef

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

I tried opening extracted data with VLC media player. As a result, about 4-second audio was played and characters were read.
I obtained the flag by writting down these characters and adding FLAG{}.

FLAG{thisismpng3}

WaniCTF 2021