Free Flag

「freeflag.png」というリンクで、ファイル touched.png が与えられた。

画像の内容を確認すると、右下に以下のテキストが書かれていた。

A file touched.png was given via a link saying "freeflag.png".

Checking the image, I found this text in the right bottom:

Made via "The Ultimate Flag Hider". Try it at flag.sdc.tf!

http://flag.sdc.tf/ にアクセスしてみると、画像とテキストを指定し、画像にテキストを隠せるサービスのようだった。

真っ白な幅512、高さ512のPNG画像とテキスト flag を指定して処理を行い、処理結果の画像をペイントの塗りつぶし機能を用いて調べると、 右下にテキストが追加されたほか、左上の数ピクセルの色が変わっていることがわかった。
詳しく見ると、色が変わったのは4ピクセルであり、これは入力したのが4文字であることに対応していると予想できた。
実際、1文字の f を指定すると、1ピクセルしか色が変わらなかった。

ABCDEFGHIJKLMNO を指定して処理を行い、結果の画像にCyberChefの Extract RGBA (Include Alpha 有効) をかけた結果の最初の部分は、以下のようになった。 (改行を補っている)

Opening http://flag.sdc.tf/, I found that it should be a service where we can specify an image file and a text data to have it hide the text in the image.

I tried having the service hide a text flag to a all-white PNG image with width 512 and height 512. Then, I examined resulting image with the "fill" feature of Microsoft Paint.
As a result, I found not only that a text is added to the right bottom but also that the colors of a few pixels in the left top are changed.
Seeing more in detail, I found that colors of 4 pixels are changed, and I guessed that this corresponds to the 4-character input string.
To support this, I tried hiding 1-character text f and found that the color of only 1 pixel changed.

I tried hiding ABCDEFGHIJKLMNO and applying "Extract RGBA" (with "Include Alpha" enabled) on CyberChef to the result.
Here is the first part of the result with newlines added:

252,254,252,254, 252,254,253,252, 252,254,253,254, 252,255,252,252, 252,255,252,254, 252,255,253,252, 252,255,253,254, 252,254,252,253, 252,254,252,255, 252,254,253,253, 252,254,253,255, 252,255,252,253, 252,255,252,255, 252,255,253,253, 252,255,253,255,

見比べた結果、LSBをビット0、MSBをビット7として、

ことがわかった。さらに、2BRbr について同様の処理を行った結果は、以下のようになった。

Compareing the result with the input string, I found that:

(the LSB is bit 0 and the MSB is bit 7)
Also, here is the result of the same process with the input string 2BRbr:

255,252,253,252, 252,254,253,252, 253,254,253,252, 254,254,253,252, 255,254,253,252,

このことから、

ことがわかった。

これらに基づき、画像データから隠されたテキストデータを抽出する以下のRecipeを作成した。

From this result, I found that:

Based on these findings, I created this Recipe to extract the hidden text data from the image data.

Extract RGBA, 5 more - CyberChef

このRecipeに touched.png を入力すると、flagが得られた。

I obtained the flag by putting touched.png as the input of this Recipe.

sdctf{St3g0nOgrAPHY_AnD_Cl0s3d_SRC_Are_A_FUN_C0mb0}

San Diego CTF 2022