Skip to content

Instantly share code, notes, and snippets.

@n18008
Last active December 16, 2022 10:28
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save n18008/bdad2ac763f3fc0fc5aa32ee13f1d29f to your computer and use it in GitHub Desktop.
Save n18008/bdad2ac763f3fc0fc5aa32ee13f1d29f to your computer and use it in GitHub Desktop.
この記事はIT College Okinawa Advent Calendar 2022 16日目の記事です。

7F 45 4C 46

JPEGの中に含まれたPNGの話

はじめに

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ファイル)を宝探し感覚で探して、バイナリデータは得体の知れないデータではなく意味を持ったデータであるということを少しでもわかっていただこうかと思います。

バイナリの海から宝探し

article_picture01
突然ですがここに1枚のjpegファイルがあります。
名前はHello.jpgのようです。

article_picture02
フォトで開いてみましたが何の変哲もなくただ「はじめまして」と書かれた画像ですね。
今回はタイトルの通り、このjpegファイルの中にpngファイルが存在するらしいです。
画像編集ソフトで開いてみたりしましたが視認できる部分におかしな点はなさそうでした。
もしかしたらこのjpegファイル自体がそもそもpngファイルで、ただ名前を変更されただけでタイトルに踊らされているのかもしれません。とりあえずこのファイルが本当にjpegファイルなのか調べてみましょう。 ファイルを判別する方法がないか調べてみたところLinux(Ubuntu)にファイルタイプを判定するためにfileコマンドが存在するらしく、ファイルタイプを調べてみました。

article_picture03
コマンドを実行してみるとHello.jpgは本当にJPEGイメージのようです。fileコマンドはどのようにファイルをjpegだと判断したのでしょうか?
どうやらfileコマンドはファイル種別を表すマジックナンバー(magic number)を利用してjpegだと判断したようです。
マジックナンバーとはファイルを識別するのにつかわれるファイル内の特定の位置にある特定の数値のことで、ほとんどはファイルの先頭に格納された数バイトのデータ(数値)です。
jpegファイルのマジックナンバーを調べてみるとjpegファイルをバイナリエディタで開いたとき、先頭の2バイトが
FF D8となるようです。(ここからはバイナリと言いつつ人間が見やすいように16進数表示で見ていきます。←まだ見やすくないですが)
さっそくバイナリエディタで開いてみましょう。

article_picture04
バイナリエディタでHello.jpgを開き、先頭の2バイトを確認してみると確かにFF D8が表示されています。これはjpegで間違いないようです。
他に確認するところがないか詳しくjpegファイルの構造を調べてみるとjpegファイルは先頭の2バイトだけでなく末尾の2バイトも決まっていることがわかりました。
jpegファイルの末尾の2バイトはFF D9となるようなのでこちらも確認してみましょう。

article_picture05
末尾を見てみるとなんとFF D9にはなっていません!なぜでしょうか?
バイナリの中からIENDの文字列が見受けられます。IENDを調べてみるとどうやらこの値はPNGファイルのイメージ終端のようです。
つまりHello.jpgは先頭がjpeg、末尾がpngという摩訶不思議な構造になっています。
さすがにこの構造をみて不思議という疑問で終わらせるわけにはいきません。
これはもしかするとjpegファイルのバイナリデータの後ろにpngファイルのバイナリデータが結合されているのではないかと想像することができます。
jpegファイルの終端FF D9がないかバイナリエディタで検索してみます。

article_picture06
見つかりました。なんとFF D9の後ろに並んでいるバイナリの文字列にはPNGと表示されています。どうやらここがHello.jpgの終端かつ謎のPNGファイルの先頭ではないでしょうか?
※調べたところ89 50 4E 47 0D 0A 1A 0AはPNGのマジックナンバーでした。
さっそく89 50 4E 47 0D 0A 1A 0Aからファイルの末尾までバイナリを取り出して別のファイルとしてエクスポートしてみましょう。 エクスポートしたファイルは恐らくpngファイルなのでフォトで開いてみると

article_picture07
「FlagIs_ITCollege2022」と書かれた画像が開かれました!
Hello.jpgをフォトで開いたときはわからなかった文字列が出現してとても驚きです。
何はともあれ普段使っているだけでは見ることができなかったであろうデータをバイナリの中から見つけることができました!

おわりに

いかがだったでしょうか?
今回は少ない前提知識で理解できるような内容を持ってきましたがバイナリとコンピュータの関係についてより学んでいくことでリバースエンジニアリングと呼ばれるマルウェア解析や脆弱性の発見・解析の基礎技術へステップアップさせることができます。
少しでもバイナリという分野に興味を持っていただけたのであれば私としては幸いです。

おまけ(参加して記事を書いた感想)

初めて記事を書きましたが想像していたより大変でした。特に文章と体裁...
後半は文章を考えることが少し億劫になってしまい雑な〆で申し訳ありません。。。
実際はハンズオン形式で記事を読み、手を動かしながら画像を見つけだすことを考えていたのですがHello.jpgを配布するためにリポジトリを作成するのも大げさだと思ったのでやめました。実際にやってみたい方がいましたらITカレッジ沖縄のSlackからDM、もしくはネットワーク・セキュリティちゃんねるで連絡ください。
ファイアウォールやネットワークセキュリティ設計は仕事の中で話し相手がいますがリバースエンジニアリングやデジタルフォレンジックのような趣味でやっているコンピュータセキュリティの話は話し相手がいないのでこの記事で興味を持ってくれた方は話し相手になってくれると嬉しいです。
最後にIT College Okinawa Advent Calendarを開催してくれた奥戸先生と企画者の皆さんに記事を書く機会を与えてくれたこと感謝いたします。

@t-asato
Copy link

t-asato commented Dec 16, 2022

楽しかったです。久しぶりにバイナリエディタダウンロードして実行してみました

@n18008
Copy link
Author

n18008 commented Dec 16, 2022

@t-asato
楽しんでいただけたようで嬉しいです。
昨今のゲームはサーバ上にデータを保存する構成が多いので認証をするためのサーバなどに対するDOS攻撃が目立ちがちですが、クライアント側アプリケーションに対する解析は今でも脅威になり得ますので自分の作ったゲームをバイナリレベルで見てみるのは良い経験になりますよね。

@louiee
Copy link

louiee commented Dec 16, 2022

うおおお。ありがとう。Gistいいな。コメントかけるし。
いかにもITなアドベントカレンダーで嬉しい。ほんとはこんなネタがもっと増えるとありがたいだけど、もうちょいかなぁ・・・と。

@n18008
Copy link
Author

n18008 commented Dec 16, 2022

@louiee
おくと校長先生、お世話になっています。
アドベントカレンダーの運営ありがとうございます。
在学時は理解できずに書くことができなかったのですが、やってみるととても楽しいですね。
ぜひとも自由研究のようなネタももっと増やしていきましょう。
やりたいことを見つけた人間は強いはずなので!

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment