(ネタバレ注意)#RECRUIT_CODE、全問を解いてみた(?)

f:id:shutingrz:20140604224140p:plain
クリア画像。q1からq5、そしてlast questionを解くと表示されます。
クリアしたところで何も良いことはないけど。



というわけで、このたびリクルートが出したインターンシップの特設ページの暗号解読サイトを解いてみます。

解読できる学生求む!ターミナルに残された暗号 #RECRUIT_CODE|リクルートホールディングス サマーインターンシップ 2014

といっても正攻法では解けないんですけど。
どうしてもクリアしたかったので裏道からクリアしてみました。


↓↓↓※ネタバレ注意です※↓↓↓




























それでは見て行きましょう。おもむろにFireBugを開き、回答を送信した際のレスポンスを確認してみます。

f:id:shutingrz:20140604224913p:plain

うーん、何も通信はしていないのにWrong Answerと応答がされますねー。ということで、全てクライアントで処理しているってことがわかります。
つまりjsのコードに解答が存在し、その解答と比較して正解かどうかを判定しているんですね。

というわけで、ページのソースコードを確認してみましょう。こういう時はscriptタグのsrcを見ると該当処理のソースがあるんですよ。

今回このページがインポートしてるjsは、

<script src="../js/lib/md5.js"></script>
    <script src="../js/lib/jquery.js"></script>
    <script src="../js/lib/underscore.js"></script>
    <script src="../js/app.min.js"></script>
    <script>

の4つです。上3つはlibディレクトリに存在するので、これは自作ではなさそうなので一番下のapp.min.jsが怪しいです。見てみましょう。

app.min.jsの中身を見ると、ターミナルを形付けるソースコードだとわかります。
しかしソースコードが長いので、解答がありそうなところだけ探してみます。
先ほど回答を入力した際に表示された、「Wrong Answer」を検索ワードにし、前後のソースコードを見ます。

f:id:shutingrz:20140604225621p:plain
すると、左下付近に、answerHashがあるのがわかります。これは、解答をハッシュして比較しているんでしょう。
また、これはどんなアルゴリズムでハッシュされたのでしょうか。先ほどの特設ページのscriptタグを見てみます。

<script src="../js/lib/md5.js</span>"></script>
    <script src="../js/lib/jquery.js"></script>
    <script src="../js/lib/underscore.js"></script>
    <script src="../js/app.min.js"></script>
    <script>

1行目を見てください。これはmd5ですね。
まあこれは別にわからなくてもいいです。
というのは、ハッシュをそのままググれば検索結果にハッシュのレインボーテーブルが載ったサイトがヒットするからです。

とりあえず、全ての解答のハッシュを抜き出してみましょう。

{answerHash:["e155e1bb4a9c38e3baf90637ab7865df"],name:"answer_1",question:"Q1"}),c.app.answer_2=new i({answerHash:["7d9a0d11cb36e12a68817aff945390de"],name:"answer_2",question:"Q2"}),c.app.answer_3=new i({answerHash:["312db69f5bf4447dfe3c58983083b54f"],name:"answer_3",question:"Q3"}),c.app.answer_4=new i({answerHash:["9c8d9e1d80fc923ca7d532e46a3d606f"],name:"answer_4",question:"Q4"}),c.app.answer_5=new i({answerHash:["5494af1f14a8c19939968c3e9e2d4f79","9300f2256529efedc2300a9d4e1879d0"],name:"answer_5",question:"Q5"})}


わかりますか?例えばq1の答えはe155e1bb4a9c38e3baf90637ab7865dfを平文に変換したものです。
このハッシュにsaltがなく、また平文が英字で構成されたものであればほぼ100%、検索に引っかかります。
このハッシュでググってみましょう。

f:id:shutingrz:20140604230706p:plain
でました。q1の答えは「life」です。
以下、同様にググっていけば全ての解答が判明します。
あ、last questionもありますが、それもこの方法が使えます。




以上。