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 本の丸太があります。これらの向きと端をそろえ、地面に積みます。 積む際には次のルールに従います。 地面には好きな本数の丸太を置けます。隣り合う丸太は接して置きます。 左右に隣り合う 2 本の丸太の上に、新たな丸太を 1 本置けます。 全ての丸太は一...
【息抜き】平均値と中央値【言語不問】解答と解説... 【息抜き】平均値と中央値【言語不問】 本問題は、表題のテーマで、簡単なプログラムを書くものです。 それでは以下、問題とその解答を見ていきましょう。 問題 改行区切りの文字列の各行(最大行数30)は、半角数字のみの整数(最大桁数8)になっています。 この各行の平均値と中央値を求めて下さい。小...
【息抜き】右位置揃え【言語不問】解答と解説... 【息抜き】右位置揃え【言語不問】 本問題は、表題のテーマで、簡単なプログラムを書くものです。 それでは以下、問題とその解答を見ていきましょう。 問題 改行区切りの文字列の各行は、半角数字のみの整数(最大桁数32)になっています。 この各行の先頭に任意の数の半角のアンダーバー(_)を挿入して...
【謎解きプログラム】どんな配列が得られる?【フィルター,マップ】解答と解説... 【謎解きプログラム】どんな配列が得られる?【フィルター,マップ】 本問題は、表題のテーマで、プログラムにちなんだ謎を解くというものでした。 それでは以下、各問題とその解答を見ていきましょう。 問題のオープニング ある日、出社すると、あなたのPCのログイン画面に、謎の挑戦状が表示されていた。 ...
数学の問題をプログラミングで解こう!「タンジェント・フラクション」問題解説... 問題のおさらい α と β を、0 < α < β < π/2 を満たす実数とします。 α, β の組のうち、tan(α), tan(β), tan(α+β) がすべて単位分数(分母が自然数、分子が 1 の分数として書き表せる数)となるものを考えましょう。(α, β の単位はラジアンと見なします...
【謎解きプログラム】どう比較する?【ソート】解答と解説... 【謎解きプログラム】どう比較する?【ソート】 本問題は、表題のテーマで、プログラムにちなんだ謎を解くというものでした。 それでは以下、各問題とその解答を見ていきましょう。 問題のオープニング ある日、出社すると、あなたのPCのログイン画面に、謎の挑戦状が表示されていた。 「24時間以内に謎...

今週のPickUPレポート

新着記事

週間ランキング

CodeIQとは

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

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

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