スプーキーズのちょっとTech。

SPOOKIES社内のより技工的な、専門的なブログページです。

SECCON Beginners CTF 2024 参加記

こんにちは。CTF部に入部したてほやほやのみーさんです。

実は5月の末金会後にCTF勉強会をやったこともあり部員が2人増えました!🎉

ちょうど良いタイミングで初心者向けのコンテストがあるとのことで、2024/6/15-16 に開催されたSECCON Beginners CTF 2024に参加してきました!

spookiesチームとしての参加メンバーは4名、個人参加・他チームでの参加をしているメンバーもいました。 それぞれ予定の合間を縫っての参加でしたが、spookies全体としてかなり盛り上がったコンテストでした。

spookiesチームとしては個人参加している部長を超えることを目標に頑張りました。 そしてもう一人の新入部員もなんと個人参加!ガッツがありますね!

結果は全体237位! まだまだ伸び代があります...。ありすぎます...!

そしてなんと我がCTF部部長はソロ参加で3位! 流石すぎます。

ちなみに 2024/6/21-23 は Wani CTF 2024 に参加もしていました。 まずは部長を目指して、部員同士、切磋琢磨していきたいですね。

以下、各メンバーの参加記まとめです。

chururi

[rev] assemble (161 solved)

  • mov, push, syscall 命令しか使用できない Intel x64 のアセンブラでフラグを得る問題
  • Challenge 1
    • シンプルに rax レジスタに 0x123 をいれてあげれば OK
      • mov rax, 0x123
  • Challenge 2
    • 先程の 0x123 をスタックに積んであげればいい
      • Challenge 1 の回答に push rax を追加する
  • Challenge 3
    • Hello をスタックに積んであげ、write システムコールを呼べばいい
    • rax1write システムコールを指定)、rdx5Hello の文字数 = stdout に出力する文字数)、rdi1(stdout)、rsirspHello の存在するスタックの先頭)を設定する
    • https://x64.syscall.sh/ あたりが参考になりそう
mov rax, 0x6f6c6c6548
push rax

mov rax, 1  # write
mov rdx, 5  # 'Hello' の長さ(5B)
mov rdi, 1  # stdout
mov rsi, rsp  # stack top
syscall  # システムコール実行
  • Challenge 4
    • flag.txt を読み込んで出力する問題
    • コメント参照
    mov rax, 0  # null byte
    push rax
    mov rax, 0x7478742e67616c66  # txt.galf
    push rax  # rax をスタックに積む
    mov rdi, rsp  # スタックポインタを rdi へ
    mov rsi, 0  # readonly
    mov rax, 2  # open syscall
    syscall  # システムコール実行
    mov rdi, rax  # open によって得られたファイルディスクリプタを rdi に指定
    mov rsi, rsp  # read の結果の格納先のアドレス(スタック)
    mov rdx, 1024  # 読み取りバイト数(1024B)
    mov rax, 0  # read syscall
    syscall  # システムコール実行
    mov rdx, 1024  # 出力バイト数(1024B)
    mov rdi, 1  # stdout
    mov rax, 1  # write syscall
    syscall  # システムコール実行

[pwn] simpleoverflow (683 solved)

  • 適当な文字列を大量に入力するとバッファオーバーランを起こしてフラグが得られる

[rev] cha-ll-enge (295 solved)(解けず)

  • LLVM のバイナリを読む問題。知見があったのでチャレンジしてみたが、人間逆コンパイルがうまくいかず、断念...。

[welcome] Welcome (928 solved)

  • Discord に書いてあった
  • ここに solved として書くのも憚られる

感想

最近勉強していたアセンブリの問題が出てきてラッキーだった。勉強していたのは Intel 686 系の Microsoft Assembly(MASM)だが、関連で触れていた x86-64 の知識が役に立った形となった。 が、普段は Web のエンジニアとして働いているのに Web 問を 1 問も解けなかったのは誠に遺憾だったので、予選までにトレーニングを積んでおきたいと思う。 また今回の Beginners 参加にあたって、時間を確保できなかったのが悔やまれる(6 時間程度の参加...)のでゆとりを持ちたいところ。

hiraoka

[web] wooorker (186 solved)

  • login?next=/{任意のURL}にPOSTしてやると、botが{任意のURL}にtoken(JWTアクセストークン)をクエリパラメーターに付与してアクセスしてくれます。
  • 取得できたtokenをクエリパラメータに付与してトップ/?token={token}にアクセスでflag取得できます。

感想

最近CTFにチャレンジできていなくて、久々の参戦。 beginner問題1問だけ解いて満足してしまいました(笑)。 特に難しいものではなくソース見ながら30分程度でクリア。 数時間かけて解けるあの喜びを味わいたいものですな。

mi-san

[crypto] Safe Prime (362 solved)

  • RSA暗号
  •  q = 2p + 1 となっていて、 n = pq がわかっているので、pに関する2次方程式を解いてあげれば良い
    •  pq - n = 0
    •  p(2p+1) - n = 0
    •  p = \frac{-1 \pm \sqrt{1+8n}}{4}

感想

数時間ちょろっと参加を数回やりましたが、解けたのは上記の1問だけ...。悔しい。 コンテストの前日にRSA暗号の勉強をしていたので、お、これは数式解けばいけるはず!で解法自体はスラっと出せて良かったのですが、実装を地味に間違えており苦戦。pythonだとmath.isqrtで非負整数 n の整数平方根を取ることができるんですね。新たな知見です。 [crypto] math にも取り組みましたが、結局分からず。解法をざっくり見たところ  a, bが平方根であることを利用して探索すれば良かったみたいですね。提示されている情報全てに意味があることと、数式をこねるだけじゃなくて探索等も行うことが必要なんだと学びになりました。 また、[misc] getRank も何をすればフラグを取れるかまではわかったものの、自力でフラグは取れず...。16進数をparseIntに突っ込むと10進として解釈されるんですね...。あと一歩...。辿りつきたかった。 と、学びが沢山あり、CTF楽しめました!

nishizuka

感想

色々と、飲んだり、立て込んでて、最後の1時間だけ滑り込みで参加。 ほぼ flag が見えている [misc] の正規表現の問題をやってましたが、、、分かりそうで最後までは解けず。

もう少し真剣に、自分とCTFに向き合う必要がありそうです。 部員が増えて、活発になってきたことは、とてもありがたい!

オジさんは、暖かく見守るのみ!(でも、全力でも走りたい!)

motosuke(個人参加!)

解いた問題

  • Safe Prime
  • getRank
  • simpleoverflow

解法

Safe Primeはpとqの関係式ができるので、pとqの条件を満たすnを二分探索で見つけました。 どうやら後々聞いたらsageという便利なpythonライブラリがあるらしく、それを使えば高度な計算が色々できるんだとか(素因数分解できるの強い…)

getRankは、要するに250文字以内で、10350よりも大きい数を表現してくださいという問題。0xffff...(fが298個)で、16進数としてPOST通信を送ってflag獲得。 そしてどうやら別解として、[(巨大な数の文字列), "0"]のようにして送れば、input.lengthが2になるので突破でき、そしてparseIntで巨大な数が取り出されるので突破できるという…すごいですね。

simpleoverflowは単にオーバーフローによって判定に使われる変数の値が書き変わるので、if文を通ってflag獲得というシンプルなものでした。

感想

初めてのCTFでしたが、なんとか3問解くことができてシンプルに嬉しかったです。とはいえ頑張れば解けたかも…という問題が3問くらいあり、とても悔しい思いもしました。これを機にどんどんCTFに向けて頑張っていきたいと思いました。 ところで、この次の週で開かれたWaniCTFでは結構解けるようになってきたので、この調子で頑張ります…!!