ksnctf Crawling Chaos を解いた

こんばんは。久しぶりに(1年ぶりくらい)CTFが解きたくなり、ksnctfを見てたらサクッと解けた問題があったので、忘れないうちに備忘録として書き記そうと思う。 解いた問題はksnctf 3番目の問題のCrawling Chaos。

ksnctfのリンクは以下から… ksnctf.sweetduet.info

※ちなみに私はCTFの経験はcpawCTFを全部解き終えているぐらい…(1年前近くなので記憶がない…)

Crawling Chaos問題概要

与えられたURLがありアクセスを行うとフォームが一つと送信ボタンがある。 文字を入力して送信を行うも、NOと返される。

方針

何か特定の文字列を入力すれば、良いっぽいなあ。それがFLAGだったら良いなあ。

パッと思いついたのは以下の2通り。

htmlソースコードを見る。

    <script>
  (ᒧᆞωᆞ)=(/ᆞωᆞ/),(ᒧᆞωᆞ).ᒧうー=-!!(/ᆞωᆞ/).にゃー…
    </script>

の箇所が怪しいっぽいが…それ以上の情報が得られなかったので、断念。。。

Firefoxの開発ツールを使用する。

Web系の問題なら、開発ツールを使用してなんとかしたい気持ちがある。 そんな気持ちで使ってみた。Firefox

メニュー→ウェブ開発→開発ツールの表示でいける(Ctl + Shift + Iでもいけるっぽい)

f:id:matukyou:20201213203257p:plain
Web開発ツール実行時の様子

フォームに入力&送信を実行し、デバッガーを確認すると何やら怪しいスクリプトが得られた。

(Webの保護を有効にしていた場合には、Clientで実行されるスクリプトデバッグでひっかかるのか)

$(function()
{
    $("form").submit(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;
    });
});

適当に改行している。これを見ると、pという配列が与えられていて、tは入力した文字列であることがわかる。

if(p.length==t.length)

上記より、入力文字列と与えられている配列 p の長さが一致していないといけないっぽい。

for(var i=0;i<p.length;i++) if(t.charCodeAt(i)*(i+1)!=p[i])f=false;

このコードより、入力文字列のi番目の文字(先頭の文字は0文字目)のcharCode(Asciiコード?) と i + 1を掛けたものが配列pのi番目に一致しなければならないみたい。 つまり、tの i番目の文字はは\frac{p[i]}{i +1}をAscii文字に表したものっぽい。

var p=Array(70,152,195,284,475,612,791,896,810,850,737,1332,1469,1120,1470,832,1785,2196,1520,1480,1449);

Asciiコード一覧はググればたくさん出てくる。以下のように計算を行うと…

  1. 70 /1 = 70 → F
  2. 152 /2 = 76 →L
  3. 195 /3 = 65 →A …

と答えっぽい!

あとはPythonか何かでパパっと計算スクリプト書いたらOK。書いたものは以下のような感じ…

a=[70,152,195,284,475,612,791,896,810,850,737,1332,1469,1120,1470,832,1785,2196,1520,1480,1449]

res = []
j = 1
for i in a:
    t = int(i/j)
    chr_t = chr(t)
    j = j+1
    res.append(chr_t)

print ("".join(res))

これで答えが出て無事にできた。 もっと精進します。