かたはらいたし。

個人的な技術的な活動をまとめていきたい。

ksnctf #3 Crawling Chaos

1問目と2問目は瞬殺だったんですが、この3問目で初めて躓きました。
ksnctf - 3 Crawling Chaos

Problem

http://ksnctf.sweetduet.info/q/3/unya.html

URL先のunya.htmlに飛ぶと、テキストボックスと送信ボタンがあるだけで、他には何もありません。

Answer

とりあえず、ブラウザの機能でソースを除いてみると、JavasScriptとして、以下のコード?が埋め込まれていました。

(ᒧᆞωᆞ)=(/ᆞωᆞ/),(ᒧᆞωᆞ).ᒧうー=-!!(/ᆞωᆞ/).にゃー,(〳ᆞωᆞ)=(ᒧᆞωᆞ),(〳ᆞωᆞ).〳にゃー=- -!(ᒧᆞωᆞ).ᒧうー,(ᒧᆞωᆞ).ᒧうーー=(〳ᆞωᆞ).〳にゃー- -!(ᒧᆞωᆞ).ᒧうー,(略)

これ、調べてみて初めて知ったんですが、JavaScriptエンコードの一種のようです。
(」・ω・)」うー!(/・ω・)/にゃー!encodeによると、

JavaScriptのコードを(」・ω・)」うー!(/・ω・)/にゃー!します。
変換後のコードはJavaScriptとして実行可能です。

とのことで、JavaScriptを入力するとそれに対応した(」・ω・)」うー!(/・ω・)/にゃー!語(?)を出力してくれます。

この(」・ω・)」うー!(/・ω・)/にゃー!語はブラウザで実行することによって通常のJavaScriptと同じ振る舞いをしてくれるそうなので、先ほどのページのソースを見てみます。
ChromeではうまいことJQueryで読めなかったのでFireFoxのDevelopper Toolを使ってみると、上記の(」・ω・)」うー!(/・ω・)/にゃー!は以下のように動作することがわかりました。

function() {
  var t = $('input[type="text"]').val();
  var p = Array(70, 152, 195, 284, 475, 612, 791, 896, 810, 850, 737, 1332, 1469, 1120, 1470, 832, 1785, 2196, 1520, 1480, 1449);
  var f = false;
  if (p.length == t.length) {
    f = true;
    for (var i = 0; i < p.length; i++)
      if (t.charCodeAt(i) * (i + 1) != p[i]) f = false;
    if (f) alert("(」・ω・)」うー!(/・ω・)/にゃー!");
  }
  if (!f) alert("No");
  return false;
}

整数i(0 < i < 配列pの要素数)について(i番目の文字の文字コード)*(i-1) = p[i]成り立てばいいみたいなので、逆変換を行ってみます。

import sys

p = [70, 152, 195, 284, 475, 612, 791, 896, 810, 850, 737, 1332, 1469, 1120, 1470, 832, 1785, 2196, 1520, 1480, 1449];
answer = []
i = 0
for _p in p:
        if i != 0:
                answer.append(chr(_p / (i + 1)))
        else:
                answer.append(chr(_p))
        i = i + 1

for a in answer:
        sys.stdout.write(a)

これでフラグゲットです。ちなみにこれをテキストボックスに入力すると、(」・ω・)」うー!(/・ω・)/にゃー!とアラートがでます。

感想とか

これはもう、知ってるか知らないかの話になってくると思うんで自分の知識不足を感じました。
幸いJavaScriptについては少し勉強したことがあったので、JQueryのコードさえ見つけることができればすぐにできました。