【ksnctf:Crawling Chaos】難読化されたJavaScriptのコードを解読する。

2019/03/17

CTF プログラミング

はじめに

久しぶりに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;
});
});"
(JSの記述方法が分からないので合ってるか不明ですが、見やすくするために改行などしています。)

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を提出すると無事正解することが出来ました。

自己紹介

はじめまして 社会人になってからバイクやプログラミングなどを始めました。 プログラミングや整備の記事を書いていますが、独学なので間違った情報が多いかもしれません。 間違っている情報や改善点がありましたらコメントしていただけると幸いです。

X(旧Twitter)

フォローお願いします!

QooQ