絶記

絶起の記録です

nitic ctf 2 公式解説(nanigasi_san)

お疲れさまでした。nanigasi_san作問の問題のフラグと解説です。

僕は「初めてCTFに出る人」および「競プロから来た人」向けに作問しました。

ほかの人の作った問題の解説はここにあります


お布施

↓僕のBASEとかお菓子になります。↓

Kyash


解説

Excel(☆1)[Misc]

zipを展開するとBook1.xlsxがあります。 問題文に「どこかのセルにフラグが書いてあります」とあるので、それを探します。

想定解

Ctrl+Fで「nitic_ctf」で検索すると出ます。

xmlに対してgrepでも解けますが面倒です f:id:nanigasi_san:20210906204523p:plain

nitic_ctf{plz_find_me}


image_conv(☆2)[Misc]

after_image.pngをみるとうっすらnitic_ctf{, }と書いてあるのが見えます。肝心のフラグの中身が薄すぎて見えないので、根性でコントラストを上げることで見えるようになります。温情でギリ肉眼でも見えるくらいになってるので、コントラストの上げ方がわからなかったら頑張ってください。

モニターの設定がFPS用とかになってるとマジではっきり見えちゃってたのでコンテスト中にちょっと見づらくしました。

想定解

from PIL import Image
from PIL import ImageEnhance
img1 = Image.open("image_conv/after_flag.png")
i2 = ImageEnhance.Contrast(img1)
img2 = i2.enhance(1000)
img2.show()

f:id:nanigasi_san:20210906204715p:plain

nitic_ctf{high_contrast}


ord_xor(☆3)[Crypto]

xor(c, n)はx=[0, n-1]の数をループしてord(c)にxorしていく関数です。

flagのi文字目はxor(flag[i], i)されていますが、xorの性質として二回同じ数でxorするともとに戻るので逆操作をすればよいです。

想定解

with open("./flag") as f:
    flag = f.read()


def xor(c: str, n: int) -> str:
    temp = ord(c)
    if (n + 1) % 2 == 0:
        temp ^= n
    return chr(temp)


dec_flag = ""
for i in range(len(flag)):
    dec_flag += xor(flag[i], i)
print(dec_flag)

nitic_ctf{ord_xor}

問題名をフラグにするな


tanitu_kanji(☆3)[Crypto]

変換先テーブルが二つ用意されており、あるFORMATに従ってフラグが変換されていきます。 復号処理自体は変換を逆にするだけなので、FORMATが分かれば復号できます。

FORMATの長さは10だということがわかっているので、210通りを全て全探索してフラグが出ます。この手法はbit全探索と呼ばれます。

想定解

alphabets = "abcdefghijklmnopqrstuvwxyz0123456789{}_"
after1 = "fl38ztrx6q027k9e5su}dwp{o_bynhm14aicjgv"
after2 = "rho5b3k17pi_eytm2f94ujxsdvgcwl{}a086znq"


def deconv(s: str, table: str) -> str:
    res = ""
    for c in s:
        i = table.index(c)
        res += alphabets[i]
    return res


for i in range(2**10):
    flag = "l0d0pipdave0dia244im6fsp8x"
    format = ""
    for j in range(10):
        format += str((i >> j) & 1)
        format = format[::-1]

    for f in format:
        if f == "1":
            flag = deconv(flag, after1)
        else:
            flag = deconv(flag, after2)
        if "nitic_ctf" in flag:
            print(flag)

nitic_ctf{bit_full_search}

解法をフラグにするな


web_meta(☆1)[Meta]

htmlをブラウザで開くとフラグが見当たりません。F12を押して開発者ツールを開くことでmetaタグ(表示に関係ない情報)が見れるようになり、そこにフラグが書かれています!

f:id:nanigasi_san:20210906205004p:plain

Atom結構いいですよ フラグはnitic_ctf{You_can_see_dev_too1!}


caesar_cipher(☆1)[Crypto]

アルファベットを後ろに三文字ずらすシーザー暗号なので、前に三文字動かすことで復号できます。

これは紙でも解けますね フラグはnitic_ctf{caesar}


CTFの話

道路さんが「今年はやらないんすか?」っていうのでノリで第二回が開催されました。今回はSatoooon君が作問に入ってくれたので色んな層が楽しめるCTFになったんじゃないでしょうか。

Twitterでもはなしていましたが前回は難易度分布が終わっていましたからね。

とはいえ反省もあって、RevとかPwnの低難度が少ないこと、告知が開催二日前だったことなどがありますが、まぁ全体的にはいい感じになったと思います。

第三回をやる予定はないんですがどうせやると思います。俺のTwitterをフォローするのはアレなので、偶然告知が流れてくることを祈っていてください。

では~。