はじめに
久しぶりにksnctfの問題を解いてみました。問題はCrawling Chaosというものです。
問題のサイトにアクセスすると以下のような入力フォームが出てきます。
とりあえずよくわからなかったので、適当にメッセージを入力して反応を見てみます。
まぁ案の定Noが返ってきました。
とりあえずソースコードを見てみます。
ブラウザによってソースコードの見方が異なると思いますが、私が使っているChromeでは[ctrl+u]でサイトのソースコードを見ることが出来ます。
ソースコードを見ると以下のようなコードが表示されます。
スクショが見切れていますが、12行目に大量の(」・ω・)」うー!(/・ω・)/にゃー!という文字列が入っています。
これが怪しいと思ったのですが、自力では全く分からなかったので調べました。
するとJavaScriptは難読化することが出来るみたいで、このコードは難読化されたJavaScriptみたいです。
FLAG取得まで
記号プログラミングについてざっくり解説
JavaScriptの難読化技術を探るにJavaScriptの難読化について書いてありました。今回の問題は記号プログラミングと呼ばれるものの1つみたいです。
要は記号だけでJavaScriptを記述することによって、ぱっと見どんな処理をしているのかわからなくします。
記号プログラミングについてはこちらの記事が分かりやすそうな気がします。
そして今回は(」・ω・)」うー!(/・ω・)/にゃー!という記号でJavaScriptが記述されているみたいです。詳しくは以下の2つを参考にしてください
今回の問題の解読方法
JavaScriptのデバッグに「console.log()」を使うのが鉄板みたいです。
ChoromeではF12を押すと以下の画面のようにコンソールボックスが出てくるので、そこにconsole.log()のかっこの中に先ほどの(」・ω・)」うー!(/・ω・)/にゃー!がいっぱい書かれた12行目の文字列をコピペを張り付け実行します(下記図参照)
"$(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;
});
});"
FLAGを取得する
先ほどのJavaScriptのコードを見てみると入力された文字列を文字コードに変換し、それにi+1を掛けたものがpに格納された数字と一致しているかを見ています。
なので、pに格納された数字を(i+1)で割って、文字に復元したものが答えだということが分かります。
答える求めるコードをpythonで書くと以下の通りです。
p = [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(p)):
print(chr(int(p[i]/(i+1))),end="")
具体的なFLAGはここには書きませんが、得られたFLAGを提出すると無事正解することが出来ました。
0 件のコメント:
コメントを投稿