ksnctf #3 Crawling Chaos
問題のurlにアクセスするとこのようなページが表示されます。
取り合えずこのページのソースコードを見てみましょう。するとこのような顔文字が出てきます。
この顔文字の羅列は< script>というタグに囲まれていることが注目ポイントです。これは、Javascriptです。Chromeのデベロッパーツール(F12key)を使って解読していきましょう。
console.log( 文字列 )と入力すると以下のようになります。
下部分を整理すると以下のようになります。
これは、jQueryという、JavaScriptのライブラリで、JavaScriptのプログラムを簡単に操作できるよう設計されているものです。
$(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;
});
});
このコードは次のことを行っています。
1.$('input[type="text"]').val()でテキスト入力フィールドの値を取得し、変数tに格納します。
2.Array(70,152,195,284,475,612,791,896,810,850,737,1332,1469,1120,1470,832,1785,2196,1520,1480,1449)で配列pを作成します。
3.if(p.length==t.length)でテキストの長さと配列の長さが同じかどうかを確認します。
4.テキストの長さと配列の長さが同じ場合、テキストの各文字の文字コードを取得し、その文字の位置(0から始まる)に1を加えた値と配列の対応する要素を比較します。これが一致しない場合、フラグfをfalseに設定します。
5.最終的に、フラグfがtrueであれば、特定のメッセージをアラートとして表示します。そうでなければ、「No」というメッセージを表示します。
これをpythonで解読するプログラムを書きます。
array = [70,152,195,284,475,612,791,896,810,850,737,1332,1469,1120,
1470,832,1785,2196,1520,1480,1449]
for i in range(len(array)):
c = array[i] // (i + 1)
print(chr(c), end="")
print() #出力 FLAG_fqpZUCoqPb4izPJE
よってFLAGはFLAG_fqpZUCoqPb4izPJEとわかります。
参考文献
console.log->https://qiita.com/furiirakun/items/9180d7f4766bf3219f4b
chr()->https://qiita.com/furiirakun/items/d6a10b2a03a43bedab34