ksnctf(2)
ksnctf今日も元気にやっていきましょう!
G00913 30点
円周率の中で最初に出てくる連続した10桁の素数を求める問題です。 競プロerには優しい問題でしたね!
import math def is_prime(n): if n == 1: return False for k in range(2, int(math.sqrt(n)) + 1): if n % k == 0: return False return True pi = "31415926535 8979323846 2643383279 5028841971 6939937510 5820974944 5923078164 0628620899 8628034825 3421170679 8214808651 3282306647 0938446095 5058223172 5359408128 4811174502 8410270193 8521105559 6446229489 5493038196 4428810975 6659334461 2847564823 3786783165 " pi = pi.replace(" ", "") index = 0 while True: s = pi[index:index+10] if(is_prime(int(s))): print(s) break index += 1
この素数判定のプログラムの計算量はO(√n)なので、10桁の数を判定するのには105回の計算が必要です。コンピュータは1秒で108回くらい計算できるので、十分余裕をもって計算できます。
Basic is secure? 50点
pcapの中身がブラウザで表示されてしまい、ダウンロードすらできない、、、。
結局右クリックから名前を付けて保存でダウンロードすることができました(笑)
いつも通りwiresharkで分析していきます!
Basic
httpでフィルターをかけて、上から順番に、右クリック→追跡→HTTPストリームで見ていくと、No.13のところで、
Authorization: Basic ~
というのが書かれています。これはBasic64 で暗号化されているのですが、WiresharkにはデフォルトでBasic64の復号機能が付いています!AuthorizationをクリックするとCredentialsと出てきてFlagゲットです!
Basic認証は危険なんですね、、、。
Crawling Chaos 100点
一見何の変哲もないwebサイトですが、ページのソースを見ると、とんでもないスクリプトが書かれています。
(ᒧᆞωᆞ)=(/ᆞωᆞ/),(ᒧᆞωᆞ).ᒧうー=-!!....
何だこのスクリプトは、、、!と思いながらググると、console.logを使って複合できるそうなので、console.log((ᒧᆞωᆞ)=(/ᆞωᆞ/)........)のように書き換えてあげます。そしてhtmlファイルを開いて、DevToolsのconsoleを見ると、ちゃんと復号されています。
ここで最後のほうに注目すると、
ƒ Function() { [native code] } -0 "$(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;});});
と書かれており、 平文のi文字目 × (i+1) = p[i] となるときに 絵文字が出力されていることがわかります。よってこれの逆の行動、つまりp[i] // (i+1) をすれば平文のi文字目がわかります。
p = [70, 152, 195, 284, 475, 612, 791, 896, 810, 850, 737, 1332, 1469, 1120, 1470, 832, 1785, 2196, 1520, 1480, 1449] for i, c in enumerate(p): print(chr(c//(i+1)), end="")
Onion 70点
わかんなかったので調べました。Base64が16回施されているそうです、、。こんなのどうやったらわかるんだ、、。
まあとりあえずCyberChefを使って16回復号してみます。
すると意味のありそうな形になりました。調べてみると、uuencodeというものが施されているそうです。そうとわかれば、これをtxtファイルに保存して、pythonを使ってdecodeします。
import uu uu.decode("a.txt","flag.txt")
これでカレントディレクトリにFlagが書かれたflag.txtが生成されて完了です!