強エンジニアになりたい大学生の日記

その日学んだことを日記程度に発信します。

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で分析していきます!

f:id:burst_000:20200715124906p:plain

Basicf:id:burst_000:20200715135104p:plain

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が生成されて完了です!