どうも初めまして1回生のlufeです。とりあえずバイナリアンになりたい。そんなときにseccamp2020でバイナリかるたの話を聞きました!話を聞いてバイナリかるたに惹かれてしまった私でございます。
ではまずバイナリかるたってなんだろうってところからご紹介します。
バイナリかるたはその名の通りバイナリをみてどのファイルか当てるゲームです。
公式HP(https://kozos.jp/binary-karuta/)でもあるように簡単に説明しますと、
上記のような取り札がありまして、それに対応したバイナリがあります。例えばpngファイルを例に出すと
このバイナリを見て「スパーン!」ととるということです!
なので今回はまずはpngファイルをとる能力を得るということで
早速簡単にpngファイル解析
ここで実際にバイナリファイルを見ていこうと思います。今回取り上げるのは大阪大学CTFサークルのWani hackase様主催のWaniCTF2020の問題にもなりましたpngファイルのバイナリを解説させていただきます。
実際の問題はpngファイルのバイナリのチャンクを「WANI」と書き換えられていたとう問題でした。まずこれを直すには「WANI」の場所をどのように直すかを知っていなければ解けません。実際は「WANI」という文字列を検索して置き換えるだけですが、では実際にpngファイルのバイナリを見ていきましょう!
今回は上記の「いらすとや」のフリー素材を使わさせていただきます!では早速このpngファイルの画像をバイナリエディタで見ていきましょう!(バイナリエディタはBz)バイナリは16進数です。
実際にバイナリエディタで開いてみるとこのように表示されます。ここでまずpngファイルの基本データ構造を見ていきましょう!
基本データ構造
名前 | サイズ | 解説 |
PNGヘッダー | 8byte | PNGファイルあることを示す |
IHDRチャンク | 25byte | PNGファイルの情報 |
IDATチャンク | nbyte | 画像のデータ |
IENDチャンク | 12byte | PNGファイルの最後 |
pngファイルは最初の8byte以外チャンクと呼ぶ構造でなりたちます。大体のファイルはヘッダーというものがありましてそこで大体のことは識別できます。PNGファイルでは最初の8byteは89 50 4E 47 0D 0A 1A 0Aであらわしています。しかしpngファイルはASCIIコードで.pngと書いているためバイナリかるたでは最初に示したバイナリを見ていただくと、ここがXX XX XX XX 0D 0A 1A 0Aとあらわされていることが多いです… 残念です。
参考までに0D 0A 1A 0Aは大体書き換えられたことを検知するために利用されるものです。
チャンク構造
名前 | サイズ | 説明 |
Length | 4byte | データ長 |
Chunk Type | 4byte | チャンクの種類 |
Chunk Data | Length byte | チャンクデータ |
CRC(Cyclic Redundancy Check) | 4byte | 巡回冗長検査 |
※一応バイトオーダーはビックエンディアンです。
Lengthは上の表のとおりChunk Dataの長さを表します。0 ~ 2^31-1までの値が入ります
チャンクの種類
上記に紹介したIHDR・IDAT・IENDと他にもIPLTは必須チャンクって言います。CTFではIPLT以外がすべて「WANI」になっていました!
なのでここをどのようにすればいいのか!
※カーソル位置がチャンクの最初のbyteです。
IHDR
PNGヘッダーの直後に必要なチャンクです。
サイズ | 名前 | 説明 |
4byte | Length | Data長 常に13 |
4byte | Chunk Type | 49 48 44 52 (IHDR) |
4byte | Chunk Data | 画像の横幅 |
4byte | Chunk Data | 画像の縦幅 |
5byte | Chunk Data | ビット深度・カラータイプやいろいろな手法 |
4byte | CRC | Chunk TypeとChunk Dataで決まる |
IDAT
画像のデータで、最低で1個は必要です。
サイズ | 名前 | 説明 |
4byte | Length | Data長 |
4byte | Chunk Type | 49 44 41 54 (IDAT) |
nbyte | Chunk Data | イメージデータ |
4byte | CRC | Chunk TypeとChunk Dataで決まる |
IEND
PNGファイルの最後を教えてくれるチャンクです。(全て同じ値)
これより先は読み込まれない。
この後ろになんか隠してもいいかも・・・?
サイズ | 名前 | 説明 |
4byte | Length | 0000 |
4byte | Chunk Type | 49 45 4E 44 (IEND) |
4byte | CRC | AE 42 60 82 |
結果
以上のことを覚えていればもし、バイナリかるたでバイナリを表示させられてもすぐにpngファイルである!ってわかりスパーン!ととることができます!これでまた一つ成長!
他のファイルも調べてみればいろいろとでてくるのでバイナリを愛しましょう♡!