7F 45 4C 46
IT College Okinawa Advent Calendar 2022の16日目を担当します。卒業生のn18008です。
月日が経つのは早いもので2022年も12月に差し掛かりもう2023年も目の前に迫っています。
2022年、私自身に何か新しいイベントがあったわけでもなく、せっかくなら1つくらいはやったことないものに挑戦しようと思い記事を投稿してみました。
初投稿なので読みにくい文章になってしまうかもしれませんが大目に見てもらえると幸いです。
IT College Okinawa Advent Calendarなので私はコンピュータに関係する話で参加しようと思います。
この記事を読んでいる方はバイナリデータをご存知でしょうか?
バイナリとは2進数のことです。0と1が羅列されるやつです。
普段はコンピュータをSNSやゲーム、Youtubeなど様々なことに使っているため忘れてしまいますが、コンピュータは電子計算機と呼ばれる与えられた手順に従って複雑な計算を自動的に行う機械です。
コンピュータは2進数を用いて計算しており、私たち人間がモニター越しに見ている文字、画像、映像やスピーカー越しに聞いている曲、マイクに入力した声など様々なデータはコンピュータの内部で全て2進数のデータとして処理されています。
つまりバイナリデータとは、デジタルコンピュータが扱う2進数で表された全てのデータのことです。
私はITカレッジ沖縄に入学する以前、コンピュータの知識が全くなかった頃にドラマや映画、時々報道されるクラッカーのニュースで見た黒い画面に羅列される0と1の羅列を用いてコンピュータを自由自在に扱う姿がとてもおもしろい世界に映っていたことを覚えています。
コンピュータに関わり改めてそれらを見直してみると誇張表現であったと理解し、人間が0と1を直接扱いコンピュータを操作することは無いとわかってしまったのですが...それでも未だにバイナリデータから何かしら意味のあるデータを見つけ出した時はサイバー系物語の主人公になったような高揚感を思い出します。
少し残念なことにITカレッジ沖縄ではバイナリに関する授業はないためバイナリは得体の知れないデータと認識している人は少なくないはずです。(実際得体の知れないものではありますが。。。)
なので今回は画像ファイル(JPEGファイル)の中に隠された画像ファイル(PNGファイル)を宝探し感覚で探して、バイナリデータは得体の知れないデータではなく意味を持ったデータであるということを少しでもわかっていただこうかと思います。
突然ですがここに1枚のjpegファイルがあります。
名前はHello.jpgのようです。
フォトで開いてみましたが何の変哲もなくただ「はじめまして」と書かれた画像ですね。
今回はタイトルの通り、このjpegファイルの中にpngファイルが存在するらしいです。
画像編集ソフトで開いてみたりしましたが視認できる部分におかしな点はなさそうでした。
もしかしたらこのjpegファイル自体がそもそもpngファイルで、ただ名前を変更されただけでタイトルに踊らされているのかもしれません。とりあえずこのファイルが本当にjpegファイルなのか調べてみましょう。
ファイルを判別する方法がないか調べてみたところLinux(Ubuntu)にファイルタイプを判定するためにfile
コマンドが存在するらしく、ファイルタイプを調べてみました。
コマンドを実行してみるとHello.jpgは本当にJPEGイメージのようです。fileコマンドはどのようにファイルをjpegだと判断したのでしょうか?
どうやらfileコマンドはファイル種別を表すマジックナンバー(magic number)を利用してjpegだと判断したようです。
マジックナンバーとはファイルを識別するのにつかわれるファイル内の特定の位置にある特定の数値のことで、ほとんどはファイルの先頭に格納された数バイトのデータ(数値)です。
jpegファイルのマジックナンバーを調べてみるとjpegファイルをバイナリエディタで開いたとき、先頭の2バイトが
FF D8
となるようです。(ここからはバイナリと言いつつ人間が見やすいように16進数表示で見ていきます。←まだ見やすくないですが)
さっそくバイナリエディタで開いてみましょう。
バイナリエディタでHello.jpgを開き、先頭の2バイトを確認してみると確かにFF D8
が表示されています。これはjpegで間違いないようです。
他に確認するところがないか詳しくjpegファイルの構造を調べてみるとjpegファイルは先頭の2バイトだけでなく末尾の2バイトも決まっていることがわかりました。
jpegファイルの末尾の2バイトはFF D9
となるようなのでこちらも確認してみましょう。
末尾を見てみるとなんとFF D9
にはなっていません!なぜでしょうか?
バイナリの中からIENDの文字列が見受けられます。IENDを調べてみるとどうやらこの値はPNGファイルのイメージ終端のようです。
つまりHello.jpgは先頭がjpeg、末尾がpngという摩訶不思議な構造になっています。
さすがにこの構造をみて不思議という疑問で終わらせるわけにはいきません。
これはもしかするとjpegファイルのバイナリデータの後ろにpngファイルのバイナリデータが結合されているのではないかと想像することができます。
jpegファイルの終端FF D9
がないかバイナリエディタで検索してみます。
見つかりました。なんとFF D9
の後ろに並んでいるバイナリの文字列にはPNGと表示されています。どうやらここがHello.jpgの終端かつ謎のPNGファイルの先頭ではないでしょうか?
※調べたところ89 50 4E 47 0D 0A 1A 0A
はPNGのマジックナンバーでした。
さっそく89 50 4E 47 0D 0A 1A 0A
からファイルの末尾までバイナリを取り出して別のファイルとしてエクスポートしてみましょう。
エクスポートしたファイルは恐らくpngファイルなのでフォトで開いてみると
「FlagIs_ITCollege2022」と書かれた画像が開かれました!
Hello.jpgをフォトで開いたときはわからなかった文字列が出現してとても驚きです。
何はともあれ普段使っているだけでは見ることができなかったであろうデータをバイナリの中から見つけることができました!
いかがだったでしょうか?
今回は少ない前提知識で理解できるような内容を持ってきましたがバイナリとコンピュータの関係についてより学んでいくことでリバースエンジニアリングと呼ばれるマルウェア解析や脆弱性の発見・解析の基礎技術へステップアップさせることができます。
少しでもバイナリという分野に興味を持っていただけたのであれば私としては幸いです。
初めて記事を書きましたが想像していたより大変でした。特に文章と体裁...
後半は文章を考えることが少し億劫になってしまい雑な〆で申し訳ありません。。。
実際はハンズオン形式で記事を読み、手を動かしながら画像を見つけだすことを考えていたのですがHello.jpgを配布するためにリポジトリを作成するのも大げさだと思ったのでやめました。実際にやってみたい方がいましたらITカレッジ沖縄のSlackからDM、もしくはネットワーク・セキュリティちゃんねるで連絡ください。
ファイアウォールやネットワークセキュリティ設計は仕事の中で話し相手がいますがリバースエンジニアリングやデジタルフォレンジックのような趣味でやっているコンピュータセキュリティの話は話し相手がいないのでこの記事で興味を持ってくれた方は話し相手になってくれると嬉しいです。
最後にIT College Okinawa Advent Calendarを開催してくれた奥戸先生と企画者の皆さんに記事を書く機会を与えてくれたこと感謝いたします。
楽しかったです。久しぶりにバイナリエディタダウンロードして実行してみました