CodeIQ MAGAZINECodeIQ MAGAZINE

【謎解きプログラム】データをバイナリで見てみよう【バイナリ】解答と解説

2017.03.21 Category:CodeIQ問題解説・リーダーボード Tag:

  • 3
  • このエントリーをはてなブックマークに追加
entry

言語不問で、プログラムにちなんだ謎を解く「謎解きプログラム」。

あなたは見事、謎を解けましたか? というわけで、出題者の柳井さんによる解答と解説をどうぞ!
by CodeIQ運営事務局

【謎解きプログラム】データをバイナリで見てみよう【バイナリ】

本問題は、表題のテーマで、プログラムにちなんだ謎を解くというものでした。

それでは以下、各問題とその解答を見ていきましょう。

問題のオープニング

ある日、出社すると、あなたのPCのログイン画面に、謎の挑戦状が表示されていた。

「24時間以内にが解けない場合は、このPCのデータは消失する。

 は、あなたが真のプログラマーなら解けるものだ」

これは挑戦状ではなく脅迫状だ!

そこには、見たことのない謎が掲載されていた。

あなたは歴戦のプログラマーとして、データを救うために、この謎に挑むことになった。

問題1

あなたは、あるファイルを、バイナリエディタで開きました。その先頭数バイトのデータは、以下のようになっていました。

// 先頭数バイト
47 49 46 38 39 61

このデータのファイル形式は、以下の選択肢のいずれかとします。選択肢の中から、ファイル形式を当てて下さい。

ヒント:「A」のASCIIコードは「0x41」、「a」のASCIIコードは「0x61」、「0」のASCIIコードは「0x30」です。

// 選択肢
GIF
PDF
BMP

この問題は、ヒントを元にして、先頭数バイトのうち文字に変換できる場所を、文字に置き換えると答えを推測することができます。

特定のファイル形式の先頭に、こうしたファイルの内容を識別する情報が入っている場合、そうしたものを、マジックナンバーや、フォーマット識別子などと呼びます(参考:マジックナンバー (フォーマット識別子) – Wikipedia)。

それでは、この問題の先頭数バイトを見て、文字に変換できる部分を置き換えていきましょう。

// 文字に変換できる部分を置き換え
47 49 46 38 39 61
↓
G  I  F  8  9  a

「47 49 46 38 39 61」は、GIFのフォーマット識別子の1つ「GIF89a」です。分かりやすく「GIF」が入っていることから、このファイルは「GIF」だと分かります。

というわけで、1番目の選択肢「GIF」が答えになります(参考:Graphics Interchange Format – Wikipedia)。

ちなみにPDFは「%PDF-」になります(参考:Portable Document Format – Wikipedia)。

BMPは「BM」になります(参考:Windows bitmap – Wikipedia)。

問題2

あなたは、あるファイルを、バイナリエディタで開きました。その先頭数バイトのデータは、以下のようになっていました。

// 先頭数バイト
89 50 4E 47 0D 0A 1A 0A

このデータのファイル形式は、以下の選択肢のいずれかとします。選択肢の中から、ファイル形式を当てて下さい。

ヒント:「A」のASCIIコードは「0x41」、「a」のASCIIコードは「0x61」、「0」のASCIIコードは「0x30」です。

// 選択肢
WAV
AVI
PNG

この問題も、ヒントを元にして、先頭数バイトのうち文字に変換できる場所を、文字に置き換えると答えを推測することができます。

それでは、この問題の先頭数バイトを見て、文字に変換できる部分を置き換えていきましょう。

// 文字に変換できる部分を置き換え
89 50 4E 47 0D 0A 1A 0A
↓
89 P  N  G  0D 0A 1A 0A

「89 50 4E 47 0D 0A 1A 0A」は、PNGのフォーマット識別子「0x89 PNG 0x0d 0x0a 0x1a 0x0a」です。分かりやすく「PNG」が入っていることから、このファイルは「PNG」だと分かります。

というわけで、3番目の選択肢「PNG」が答えになります(参考:Portable Network Graphics – Wikipedia)。

ちなみにWAVは、8バイト目から「WAVE」になります(参考:WAV – Wikipedia)。

AVIは、8バイト目から「AVI 0x20」になります(参考:Audio Video Interleave – Wikipedia)。

問題3

あなたは、あるファイルを、バイナリエディタで開きました。その先頭数バイトのデータは、以下のようになっていました。

// 先頭数バイト
50 4B 03 04

このデータのファイル形式は、以下の選択肢のいずれかとします。選択肢の中から、ファイル形式を当てて下さい。

ヒント:「A」のASCIIコードは「0x41」、「a」のASCIIコードは「0x61」、「0」のASCIIコードは「0x30」です。

// 選択肢
RAR
ZIP
CAB

この問題も、ヒントを元にして、先頭数バイトのうち文字に変換できる場所を、文字に置き換えます。

しかし、置き換えただけでは、答えを導きだすことができません。圧縮ファイルの先頭の数バイトが、どのようになっているのか、知識が必要です。

それでは、この問題の先頭数バイトを見て、文字に変換できる部分を置き換えていきましょう。

// 文字に変換できる部分を置き換え
50 4B 03 04
↓
P  K  03 04

「50 4B 03 04」は、あるファイル形式のフォーマット識別子の1つ「PK 0x03 0x04」です。これは「ZIP」ファイルの識別子になります。

というわけで、2番目の選択肢「ZIP」が答えになります(参考:ZIP (ファイルフォーマット) – Wikipedia)。

ちなみにRARは「Rar! 0x1A 0x07 0x00」になります(参考:RAR – Wikipedia)。

CABは「MSCF 0x00 0x00 0x00 0x00」になります(参考:CAB – Wikipedia)。

CodeIQ運営事務局より

柳井さん、ありがとうございました!
現在、柳井さんの最新問題が出題中です。
ぜひ挑戦してみてくださいね!

  • 3
  • このエントリーをはてなブックマークに追加

■関連記事

数学の問題をプログラミングで解こう!「ロンリー・ルーク」問題解説... 問題のおさらい 自然数 n, k に対し、縦横 n×n のマス目にチェスのルークの駒を k 個配置することを考えます。 このとき、自身から見て上下方向・左右方向のいずれにも他の駒が存在しないような駒を「はぐれルーク」と呼びます。 例えば以下は、(n, k)=(4, 5) のときの駒の配置例を示...
【謎解きプログラム】どんな数字になる?【整数のキャスト】... 【謎解きプログラム】どんな数字になる?【整数のキャスト】 本問題は、表題のテーマで、プログラムにちなんだ謎を解くというものでした。 それでは以下、各問題とその解答を見ていきましょう。 問題のオープニング ある日、出社すると、あなたのPCのログイン画面に、謎の挑戦状が表示されていた。 「24...
【謎解きプログラム】テキストのバイナリは?【テキスト バイナリ】解答と解説... 【謎解きプログラム】テキストのバイナリは?【テキスト バイナリ】 本問題は、表題のテーマで、プログラムにちなんだ謎を解くというものでした。 それでは以下、各問題とその解答を見ていきましょう。 問題のオープニング ある日、出社すると、あなたのPCのログイン画面に、謎の挑戦状が表示されていた。 ...
【謎解きプログラム】条件に当てはまる文字列は?【正規表現】解答と解説... 【謎解きプログラム】条件に当てはまる文字列は?【正規表現】 本問題は、表題のテーマで、プログラムにちなんだ謎を解くというものでした。 それでは以下、各問題とその解答を見ていきましょう。 問題のオープニング ある日、出社すると、あなたのPCのログイン画面に、謎の挑戦状が表示されていた。 「2...
【謎解きプログラム】乱数で発生する数値は?【組み合わせ】解答と解説... 【謎解きプログラム】乱数で発生する数値は?【組み合わせ】 本問題は、表題のテーマで、プログラムにちなんだ謎を解くというものでした。 それでは以下、各問題とその解答を見ていきましょう。 問題のオープニング ある日、出社すると、あなたのPCのログイン画面に、謎の挑戦状が表示されていた。 「24...
「放物線とマス目の関係」問題の解答と解説... table.nabe{ margin-left:30px; } .nabefloat{ float:right; } table.nabe td, table.nabe th{ padding:3px; } table.nabe th{ ...

今週のPickUPレポート

新着記事

週間ランキング

CodeIQとは

CodeIQ(コードアイキュー)とは、自分の実力を知りたいITエンジニア向けの、実務スキル評価サービスです。

CodeIQご利用にあたって
関連サイト
codeiq

リクルートグループサイトへ