旧・技術者見習いが一人前の技術者を目指す

制御系エンジニア経験3年、webエンジニア1年目。技術まわりのことを書きます。

完全初心者がCTFに挑戦(ksnctf 3 Crawling Chaos に苦戦)

CTF に初挑戦した。

最初に取り組んだ問題は、以下

ksnctf - 3 Crawling Chaos



が、全くの初心者なので、自力で解くことはもちろん、解説をいろいろと読んでみてもやり方がよくわからなかった。

結局数時間かけてクリアしたが、ここに解決法を詳細に記しておく。

なお、使用しているブラウザは chrome


①とりあえずリンク先に飛んでみる。

http://ksnctf.sweetduet.info/q/3/unya.html

にアクセスしてみる。

②画面にはボックスと送信のボタンしかないので、とりあえずソースを見る。

mac では option+command+i (windows では F12らしい)を押す。

すると、いかにもエンジニアっぽい画面が出てくる(google developer console)。

f:id:longtime1116:20160709132722p:plain

③怪しい箇所っぽいところに注目

12行目を見てみると、なにやら怪しい長ーい一行がある。

意味の無い文章がこんなところにあるはずがない&ところどころに","とか":"とかあって意味がありそう。

④console.log に出してみる。

ここが、初心者にはどうやっていいのか分からず困ったところだ。

まず、↑の画像の全行を、メモ帳に貼り付けて hoge.html といった名前で保存する。

次に、その hoge.html をchrome で開く。先ほどの方法で、developer console を呼び出す。

やってみればわかるのだが、今度はソースコードをいじれるようになっている(ローカルにコピーした、自分のファイルなので)。

ということで、ソースコードに修正を加え、この長い12行目の秘密を探ってみることにする。

↓の画像のように、console.log() で 12 行目をくくってしまってから、このページをリロードすると、console の部分に赤文字でぞろぞろと出てくる。

f:id:longtime1116:20160709133318p:plain

この下の方の部分を読みやすく整形すると以下みたいな感じに。

$(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を見つける
↑のコードを見ると、array の要素一つ一つに対して、正解の文字コードが存在するみたいだ。

なので、C言語でそれを解くコードを書いてみた。

#include <stdio.h> 

int
main (void)
{
#include <stdio.h>                                                                                                                                                  

int
main (void)
{
    int i;
    int array[] = {70,152,195,284,475,612,791,896,810,850,737,1332,1469,1120,
                   1470,832,1785,2196,1520,1480,1449};
    for ( i = 0; i < sizeof(array) / sizeof(int); i++ )
    {   
        char c;
        c = array[i] / ( i + 1); 
        printf("%c", c); 
    }   
    printf("\n");

    return 0;
}
||>