ksnctf Write up

中途半端になっていたり解けなくて他の人のWrite up見て写経しっぱなしになっていたりするので解き直しつつ解法と知識を今一度整理しようと思って書き始めた次第。
順次追記予定。

Crawling Chaos

問題のurlを覗くとフォームのみのサイトに飛ばされる。何いれてSubmit押しても違うっぽいのでソースを見ると明らかに怪しい部分が。
うーにゃーコードなるものをconsole.log()に挟んで実行してあげると元のコードらしきものが出てくる。

$(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;});});  

これが怪しい。
整形して読みやすくしたものが以下。(最後はめんどくさくなった)

$(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;});});  

見た感じ入力されたn(0, 1, 2...)文字目の文字コードxに対して(n+1)*xをした数字が配列pのn番目と等しければ良いので逆算するコードを書いてあげればいい。
そうして出来たコードPython3: q3.pyが以下。

p = [70,152,195,284,475,612,791,896,810,850,737,1332,1469,1120,1470,832,1785,2196,1520,1480,1449]  
s = ''  

for i in range(len(p)):  
    c = chr(int(p[i]/(i+1)))  
    s += c  

print(s)  

実行するとフラグが吐き出されます。