(ネタバレ注意)#RECRUIT_CODE、全問を解いてみた(?)
クリア画像。q1からq5、そしてlast questionを解くと表示されます。
クリアしたところで何も良いことはないけど。
というわけで、このたびリクルートが出したインターンシップの特設ページの暗号解読サイトを解いてみます。
解読できる学生求む!ターミナルに残された暗号 #RECRUIT_CODE|リクルートホールディングス サマーインターンシップ 2014
といっても正攻法では解けないんですけど。
どうしてもクリアしたかったので裏道からクリアしてみました。
↓↓↓※ネタバレ注意です※↓↓↓
それでは見て行きましょう。おもむろにFireBugを開き、回答を送信した際のレスポンスを確認してみます。
うーん、何も通信はしていないのに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」を検索ワードにし、前後のソースコードを見ます。
すると、左下付近に、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%、検索に引っかかります。
このハッシュでググってみましょう。
でました。q1の答えは「life」です。
以下、同様にググっていけば全ての解答が判明します。
あ、last questionもありますが、それもこの方法が使えます。
以上。