SECCON Beginners CTF 2023に参加しました
ctfは初めてですが、メンバーが強くチーム24位でした。
私は開始直後にreversingとcryptoの簡単めのものを解いてあとは寝ていました。
参加経緯
普段ボードゲームやボードゲーム以外を一緒にしているdiscord鯖で募集が立つ。
beginner回とのことなので興味があるくらいのレベルでもいいかなと思い参加することに。
解いた問題
問題名(ジャンル/難易度)表記です。詳細はこちらから。
Half(reversing/beginner)
概要
バイナリファイルってなんのファイルなのか調べてみよう!
解法
バイナリエディタを入れて中身を見てみる。
すると、flagと同じフォーマットの文字列があるのでそれを提出するとAC。
コピペミスで空白が入り2度ほどWAった。
Coughingfox2(crypto/beginner)
概要
バイナリ化されたflagに対し、(flag[i] + flag[i+1]) ** 2 + i を計算した結果をシャッフルした配列targetが与えられる。
解法
配列の各要素が数千~数万だったので、flag[i]は数十~数百だろうと見当をつける。
※フラグのフォーマットは ctf4b{[\x20-\x7e]+} です。からわかったらしい。
すると要素に対するiの寄与が小さそうに見えるので、各targetの要素に対し引くと平方数になるようなiを特定する。するとflag[i] + flag[i+1]がわかるので、flag[0]がcであることから復元。
Conquer(crypto/easy)
概要
数値化されたflagと、flagと長さが同じ中でランダムに生成したkeyがある(この時点でkeyは与えられない)。
keyを何度かROL(1回左シフトし、lengthからはみ出た最上位のビットを最下位に移す)し、flagにxorを取る作業を32回行う。最終的なkeyとflagが与えられる。
解法
逆操作が可能そうな操作であったため、LORという関数を作り逆操作を行ってみるが、その結果がなかなかdecode出来ない。
discordで相談すると最後のxor取り忘れと、lengthの考慮漏れ(key生成時に最上位が落ちている可能性)が判明し、修正するとAC。
総括
解ける問題を解くのは楽しく、詰まったときにチームメイトとわいわいがやがやしている時間も楽しかった。
ただ、今回手を付けなかったジャンル(pwnable/misc/web)は正直どこから手を付ければよくわからないという状況で暇を持て余していたという状態だったので、今後も積極的に参加するかと言われたら少々怪しい。
全体としては自身の手の届く範囲でできるAHCとかのほうが楽しさが大きいと思っている。