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でもいけるっぽい)

フォームに入力&送信を実行し、デバッガーを確認すると何やら怪しいスクリプトが得られた。
(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;
このコードより、入力文字列の番目の文字(先頭の文字は0文字目)のcharCode(Asciiコード?) と
を掛けたものが配列pの
番目に一致しなければならないみたい。
つまり、tの
番目の文字はは
を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コード一覧はググればたくさん出てくる。以下のように計算を行うと…
- 70 /1 = 70 → F
- 152 /2 = 76 →L
- 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))
これで答えが出て無事にできた。 もっと精進します。