8946 Take#16
今回は「http://www.hackerschool.jp/hack/」の正答率が6番目に高い(2019/08/03現在)「Take#16」を解いていきたいと思います。
http://www.hackerschool.jp/hack/www.hackerschool.jp
環境
- Windows10
- Google Chrome
Take#16
Take#16にアクセスすると、下図のような「パスワード」を入力するフォームがあるページが出てくると思います。今回は、パスワードを入手しなければならないようですね。
手始めに、「突破する!」を押すとどのような動作をするのかを確認していこうと思います。
「[F12]」(もしくは、右クリックをして「検証」)を押して、デベロッパーツールを開き、「突破する!」のボタンの箇所を特定します。
デベロッパーツールが出たら、突破する!のタグがどこにあるかを確認します。上図左上にある赤枠のマウスのカーソルのようなマークをクリックして、「突破する!」をクリックします。すると、「突破する!」の箇所がハイライトされるはずです。
ここで、onclick属性に注目してみると「fnFormSubmit()」という関数が指定されていて、ボタンが押されるとこの関数を実行するようになっているようです。この関数がどのようなものなのか、確認していきましょう。
このHTML内で関数を検索するために、「fnFormSubmit()」をダブルクリックして選択した状態にし、「[Ctrl]+[F]」を押します。すると、自動的に検索バーに文字が入力されます。
この状態で「Enter」を押下すると、、、
何やらif文で、「入力したパスワード「input_id」とスクリプト内の『10001011110010』が等しいか」という条件が設定されています。
おっ?「10001011110010」これが答えじゃん!?
突破しましょう!
あれれ?おかしいぞ~??
はい、茶番はここまでにしましょう。
今回の「10001011110010」は、2進数です。入力したパスワードと「10001011110010」を等しいか評価していますが、入力したパスワードが2進数では突破できませんでした。
もう一度よく見てみると、入力されたパスワードを「parseInt()*1 関数」で文字列から整数に変換しています。
そして、整数に変換されたパスワードを「binary()」関数を使って何かしているようです。
binary(parseInt(document.form1.input_id.value)
そこで、binary()関数を見てみましょう。
function binary(input) { return input.toString(2); }
binary()関数は、引数として受け取った整数のパスワードを「input」変数に代入して、「input.toString(2)*2
」でinputに代入された整数を2進数の文字列に変換しています。そして、2進数の文字列に変換されたパスワードを「return」で返しています。
つまり、今回のif文では、「入力されたパスワード(10進数)を2進数に変換して「10001011110010」と等しいか」評価しているのです。
ここまでわかれば後は、「10001011110010」を10進数に変換するだけです。
方法はいろいろありますが、今回はWindows標準の「電卓」アプリを使います。
「[windows]+[S]」を入力すると検索バーが出るのでそこに「calc」と入力すると、検索結果に電卓が表示されます。
起動したら左上にある「≡」をクリックして、「プログラマー」を選択します。
次に、左側に表示されている項目の「BIN*3 」を選択し、「10001011110010」を貼り付けます。
すると、左側の「DEC」の項目に10進数に変換された数字が出てきました!(※わざと黒く塗りつぶしています)
あとはこれを入力します。
突破できました!!
いつも通り、解説を読んで終わり!
参考:
http://www.hackerschool.jp/hack/
https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/parseInt
*1:
第1引数の文字列を解析(パース)し、第2引数に与えられた基数(数学的記数法の底)にもとづく整数を返します。
parseInt() - JavaScript | MDN
*2:
引数で指定された数を基数とした数に変換し、文字列として返します。今回の場合は「2」が指定されたので、inputに代入されている整数が2進数の文字列に変換されます。
*3:BIN(binary):2進法
OCT(octal):8進法
DEC(decimal system):10進法
HEX(hexadecimal):16進法