PicoCTF2024 endianness-v2の解き方
初めてWriteUPみたいなものを書きます
問題
Here's a file that was recovered from a 32-bits system that organized the bytes a weird way. We're not even sure what type of file it is.
この問題ではchallengefileというファイルが配布されます。
解き方
配布されるファイルの中身をVScodeのHexEditorを使って確認します。
VScodeで対象ファイルを16進エディターで開きます。
すると以下のような表示であることがわかります。
エンディアン
この問題のタイトルにも入っている「endianness」について復習します。
エンディアンとはメモリにデータを保存するときにどのように配置するかを規定するものです。
今回の問題では、32bitコンピュータについて触れているため4byteをどのように並べるかを定めています。
具体的には以下の通りです。
- ビッグエンディアン
0x12345678
のデータを保存する場合には下位アドレスから12 34 56 78
のように保存されます。 - リトルエンディアン
0x12345678
のデータを保存する場合には下位アドレスから78 56 34 12
として保存されます。
シグネチャ
シグネチャについて少し触れてみたいと思います。
今回のファイルの場合ファイルの先頭から
E0 FF D8 FF ...
のようになっています。
ここでいろいろなファイルの先頭がどのような構造について少しだけ書きます。
ほかのファイルについては各自調べてみるといいかもしれません。
zip : 50 4B
png : 89 50 4E 47
jpeg : FF D8 FF E0
ここで問題を振り返りましょう。
気づいた方もいるかもしれませんがこの問題で配布されたファイルの中身は先頭から
E0 FF D8 FF
でリトルエンディアンとビックエンディアンを考えてその中身を変更すると
FF D8 FF E0
になります。
これは、JPEGファイルのシグネチャと一致します
そのため、この問題は4byteごとに反転してJPEGファイルを取得する問題ということがわかりました。
配布ファイルからJPEG画像を作る方法
今回は簡単にCyberChefというサイトを使って問題を解いていきたいと思います。
このサイトはBase64のでコードやエンコード、画像の詳細情報(Exif情報)の取得などができる便利サイトです。
Inputの"Open file as input"から今回配布されたchallengefileを選択します。
するとこのような画面になると思います。
ここからファイルのシグネチャを確認するためにTo Hexを検索し、画面中央のRecipeにドラッグします。するとOutPutがVScodeで確認したような文字が出てきます。
これを4byteずつ反転させたいので「Swap endianness」を検索、ドラッグしてData formatをHex,Word lengthを4 とすることで、4byteずつ反転しOutPut部分がJpegファイルのシグネチャと一致することがわかります。
ただ、これではフラグが何か確認することができません。このデータをJpegファイルとして保存することで確認することもできますが今回はCyberChef上で画像として表示させたいと思います。
そのために「Render Image」を検索、ドラッグします。
ただそのままだと、Invalid file typeとなってしまうのでRender ImageをRawからHexに変更することでOutPutでフラグを確認できます。
みなさんも実際にやってみてください。