ヒデホヒのおもちゃばこ

オリスロとかつくったものとかてきとーに

SECCONに参加してみたお話 (1/2)

SECCONに参加してみたお話

さて、今回はSECCON 2017 Online CTF 予選に参加してみた感想とちょっとしたWrite-upをお届けします。

完全に初心者ですので、所々間違えてるかもしれないのでコメントで教えてもらえるとありがたいです。

高松会場で参加!!

香川住みなんで高松会場で参加!
高松駅から歩いてすぐなんで道に迷わずに行けました。 f:id:pekko1215:20171210154738p:plain 地方でも開催してくれるのはうれしいですね!('ω')ノ

ついたのが17時前後、いつもは人がまばらな高松駅ですが、この日ばかりは人でいっぱい!活気にあふれていました。

さて、会場に近づいてくると人、人、人であふれています!

f:id:pekko1215:20171210155808j:plain

す、すごい人だ・・・
てかみんな半袖で寒くないのか?(:3 」∠)
ここで先にきていた組と合流します。
てかなんで金魚すくいやってるのw
どうすんのこれw

とまあここまで嘘です

ちゃんと書きます

参加経緯

今回、チーム名はKBJRで、メンバーはB1が3人、B2が5人という大所帯で参加しました。
ワタクシはセキュリティについてはまったくのシロートで、のこりのB2 4人の補助や解いたやつを見てみたいなと思い参加しました。

結果

f:id:pekko1215:20171210160945p:plain
黄色・・・赤西先生(B2)
赤色・・・ワイ(B2)
えぇ・・・
みんな何かしらの用事があったみたいで参加できなかったみたいです(:3 」∠)
しょーがないね(/・ω・)/

黄色問題はここに投げます www.marron.work

残りの赤色問題を解説したいと思います(。-`ω-)

Vigenere3d(100 points)

この問題はpythooonのコードと実行例、結果が与えられる問題です。こんな感じ

----- Vigenere3d.py
import sys
def _l(idx, s):
    return s[idx:] + s[:idx]
def main(p, k1, k2):
    s = "ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789abcdefghijklmnopqrstuvwxyz_{}"
    t = [[_l((i+j) % len(s), s) for j in range(len(s))] for i in range(len(s))]
    i1 = 0
    i2 = 0
    c = ""
    for a in p:
        c += t[s.find(a)][s.find(k1[i1])][s.find(k2[i2])]
        i1 = (i1 + 1) % len(k1)
        i2 = (i2 + 1) % len(k2)
    return c
print main(sys.argv[1], sys.argv[2], sys.argv[2][::-1])
-----
$ python Vigenere3d.py SECCON{**************************} **************
POR4dnyTLHBfwbxAAZhe}}ocZR3Cxcftw9

うーんグレードザッパー
ワタクシのパソコンにはpython実行環境は入ってますが、
pythonアレルギーなのでとりあえずnodeで実行できる形に書き換えました。

function _l(idx, s) {
    return s.substr(idx) + s.slice(0, idx)
}

const answet = "POR4dnyTLHBfwbxAAZhe}}ocZR3Cxcftw9"
//65
function main(p, k1, k2) {
    s = "ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789abcdefghijklmnopqrstuvwxyz_{}"

    t = [...Array(s.length).keys()].map((i) => {
        return [...Array(s.length).keys()].map((j) => {
            return _l((i + j) % s.length, s)
        })
    });

    i1 = 0
    i2 = 0
    c = ""
    p.split('').forEach((a, i) => {
        c += t[s.indexOf(a)][s.indexOf(k1[i1])][s.indexOf(k2[i2])]
        i1 = (i1 + 1) % k1.length
        i2 = (i2 + 1) % k2.length
    })
    return c
}

console.log(main(process.argv[2], process.argv[3], [...process.argv[3]].reduceRight((p, c) => p + c)))

暗号化としてはよく見る形ですね
元の文字(平文)にパスワード[i1]とパスワード[i2]を足して新しい文字を作っています。
よくあるやつですね、母校の小学校の学内ページのパスワードもこの形式でした。
Excelでまとめてみます f:id:pekko1215:20171210164131p:plain パスワード[i1]をP(i1)と書きます
P(i1) + P(i2) = P(i2) + P(i1)
なので、色が同じところは平文に同じ数を足すことで暗号文がとれます
f:id:pekko1215:20171210164849p:plain 「N」と「}」箇所が同じ29になっているのが確認できます。
これを使って平文を解読していきます。 f:id:pekko1215:20171210165458p:plain うーんマイルド

長くなってきたのでPoweful_Shellは次の記事で('ω')ノ