Apocalypse

ファイル chall.png が与えられた。
このファイルをWindowsの「フォト」で開くと、以下の表示となった。

A file chall.png was given.
This file looked in this way on Windows "Photos".

chall.png on Photos

画像のデータの途中に何らかの異常があり、最後のほうにflagが書かれていそうなことが読み取れる。

TweakPNG でこの画像を開くと、以下のメッセージが表示された。

This is suggesting that there are some problems in the middle of the image data, and that the flag should be the last part.

I opened the image on TweakPNG. Then, it showed this message:

Incorrect crc for IDAT chunk (is cda0e401, should be 0699358e)

該当のチャンク (0x4075 から始まる) のデータをバイナリエディタで書き換えて実験すると、異常はこのチャンクの最後のあたりにありそうだった。
よく見ると、0x6000 からの4バイトが 00 00 00 00 となっており、ここのデータが消されていそうだと考えた。
そこで、ここに当てはめてCRC-32が合うようなデータを全探索することにした。

全探索を行うため、以下のプログラムを作成した。

Investigating the chunk (beginning from 0x4075) by modifying data with a binary editor, I guessed that the problem should be hear the end of this chunk.
Looking closely, I found a 4-byte sequence 00 00 00 00 from 0x6000, and it looked like data in the part are erased.
Therefore, I decided to perform a brute-force search for data to put here to give the recorded CRC-32 value.

To perform a brute-force search, I created this program.

search.c

AWS EC2 で c6i.16xlarge インスタンス (AMI: Ubuntu Server 22.04 LTS (HVM), SSD Volume Type ami-0fcf52bcf5db7b003) を立て、
作成したファイル solve.c と与えられたファイル chall.png をアップロードし、以下のコマンドを実行した。

I launched an AWS EC2 c6i.16xlarge instance (AMI: Ubuntu Server 22.04 LTS (HVM), SSD Volume Type ami-0fcf52bcf5db7b003).
Then, I uploaded the created file solve.c and the given file chall.png, and executed these commands.

sudo apt-get update sudo apt-get upgrade sudo apt-get install gcc gcc -O3 -march=native -fopenmp -o search search.c time ./search chall.png

すると、約15分で当てはまるデータ AC ED 95 2E が見つかった。
(探索は30分経っても終わらなかった)

このデータを書き込むと、画像の表示は以下のようになった。

As a result, satisfying data AC ED 95 2E was found after about 15 minutes.
(searching continued over 30 minutes)

Putting this data into the image, the image looked in this way.

chall.png with data filled on Photos

まだおかしいようであるが、ここからflagを読み取ることができた。

There still looks some problems exists, but I succeeded to read the flag from this image.

FLAG{Watch_out_4_2023_21036}

WaniCTF 2023