【(」・ω・)」うー!(/・ω・)/にゃー!】 ksnctfのCrawling Chaosを解いてみた

【(」・ω・)」うー!(/・ω・)/にゃー!】 ksnctfのCrawling Chaosを解いてみた
LINEで送る
Pocket

こんにちは。
私にはセキュリティの知識は全くと言っていいほど無いのですが、

今日突然SECCONに参加する予定の友達に、
「この問題、JavaScriptなんだけど、解ける?」

と聞かれたので、見てみました。
問題は、ksnctfというサービスの、Crawling Chaosという問題です。

問題はここに書いてあります。
ページを開くと、

あるのは入力フォームと送信ボタンだけ。あとは、

(」・ω・)」うー!(/・ω・)/にゃー

・・・は?

この問題を解いてみました。

目次

  1. このサービスの問題の解き方
  2. なんだこの文字列は
  3. 偶然の発見
  4. コードの理解
  5. デコードする

このサービスの問題の解き方

このサービスは、

主にコンピュータセキュリティに関する問題を出題します。各問題からFLAG_123456xyzという形式の答え(Flag)を探してください。Twitterでログインすると、ランキングに参加できます。

とトップページにあるように、
問題から、FLAG_*****という文字列を何らかの方法で取得し、
解答ページに送信するという形式のようです。

先ほどの文字列から、答えが何なのか全く想像がつきません。笑

なんだこの文字列は

※長いし貼っても意味が分からないので、コードの全文は問題を読んでみて下さい。

まず前提として、このうーにゃーjsは、有効なJavaScriptです。
jsでは、マルチバイト文字を変数名などの識別子として利用することができます。

例:

とこんな感じで、さも当たり前のように全角の文字も扱うことができます。

とりあえずminifyされてて見難いので、カンマごとに改行してみました。
すると、37行目が、異様に長いです。

見てみると、うーにゃー達を+で連結しています。
ここで何らかの文字列を生成しているんだろうなぁ、と予想したものの、

まだ全く答えの想像がつきません。
そもそも顔文字が多すぎてコードを読む気すら起きません

偶然の発見

こういう問題は初めて挑んだので、気持ち悪いし解けないしでヤケになり
そのコードをjsファイルとして保存して、Nodejsから実行してみました。

jQueryっぽい文字列

??????

何故でしょう、jQueryっぽい文字列が出てきています。
ログには$ is not definedと出ています。

jQueryを読み込んでないので実行が止まったようです。
Nodejsありがとう。ありがとう。

コードの理解

コードの断片が出てきたということは、
おそらくやたら長い37行目は、jsコードを生成しているようです。

うーにゃーjsを下から順にダンプしていったら、見つけました。
カンマ区切りでいうところの、41行目です。

こんな文字列が出てきます。
おそらく、この文字列をFunction(jsコード文字列)()と実行するんだと思われます。 無駄な努力し過ぎだろ・・・

コードさえ見つけてしまえば、問題が解ける可能性は一気に高まります。
こいつを読んでみます。

デコードする

このコードは、

  1. formタグがsubmitされたら、
  2. pという正解文字列を表す配列と照合して
  3. 正解なら"(」・ω・)」うー!(/・ω・)/にゃー!"
  4. 不正解なら"No"とアラートで出す

という動作をしています。

正解の文字列を得るには、pが何を表しているのかさえわかれば良さそうなので、
配列pとその扱い方の部分だけを抜き出してみます。

tはフォームのinputタグに入力した文字列です。
tを1文字ずつASCIIコード化して、i+1を乗算した文字列が、答えなようです。

なら逆に、pをi+1で除算し、ASCIIコードから文字列化すれば答えになるはずです。
for分の中身を変えて確認してみます。

こいつを問題ページのフォームに貼り付けてみると、

うーにゃー

答えは、ここに書いてしまうと面白くなさそうなので、
この問題に興味を持った方↑のコードを実行してみて下さい。

LINEで送る
Pocket

Comments are closed.