アイジア

CTF, 情報セキュリティの学んだことメモ

ksnctf 3 Crawling Chaos

ksnctf の3問目を解説していきます。

ksnctf.sweetduet.info

問題文はunya.htmlへのリンクで、アクセスすると送信フォームがあるだけ。  f:id:favoritte15:20181112154947p:plain

XSSかなと思ったけどNoと表示されるだけでした。

Chromeでページのソースを表示します(Ctrl + U)。 f:id:favoritte15:20181112155308p:plain

するとJavascriptタグには意味不明の顔文字たちが。送信ボタンを押すとこのコードが実行されているようです。

難読化されていて読めませんが、console.logによる出力でデコードできないか試してみます。やり方は簡単で、ソースコードを全コピーしてJavaScriptのコードの部分をconsole.log()で囲み、htmlファイルとして保存するだけです。

f:id:favoritte15:20181112171411p:plain

ブラウザで見るとそれらしきコードが復元されています。入力文字列1文字目のアスキーコードを×1、2文字目を×2...していき、それが配列pの各値と等しいかを比べているだけなので逆算のプログラムは極めて簡単なものになります。

  

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 t=""
for(var i=0; i<p.length; i++)
        t += String.fromCharCode(p[i]/(i+1))
console.log(t);

なぜこんなことができるのか?

JavaScriptでは空の配列に演算子を付け加えると、それが数字や文字列として解釈されるようになります。

例:

+ → 0

~ → -1

ここで+演算子は足し算をしているのではなく、オペランド(ここでは空配列の)を数値に変換しています。 空配列を数値変換すると0になります。

(![]+"")→ true

({}+"") → [object Object]

同様に上記の記号を使用することでfalseやtrueなどの文字列を記号だけで表現できます。

これらの記号を組み合わせることで任意のjavascriptを実行できるようになります。詳しくは以下のリンクを参考にしてください。

記号だけのJavaScriptプログラミングの基本原理 - JPerl Advent Calendar 2010 Sym Track

(」・ω・)」うー!(/・ω・)/にゃー!encode - kusano_kの日記