このページの本文へ

FIXER Tech Blog - Security

FIXER cloud.config Tech Blog

「SECCON Beginners CTF 2023」で自分が解いた問題と考え方

2023年06月19日 10時00分更新

文● 後藤 祥仁/FIXER

  • この記事をはてなブックマークに追加
  • 本文印刷
FIXERブログ 「SECCON Beginners CTF 2023」で自分が解いた問題と考え方

 本記事はFIXERが提供する「cloud.config Tech Blog」に掲載された「SECCON Beginners CTF 2023 に参加した話 」を再編集したものです。

 お疲れ様です。

 最近キャラメルマキアートをよく飲んでる後藤です。

 今回はSECCON Beginners CTF 2023に参加した話を、全体的な所感と、自分が解いた問題の考え方に分けて書いていきたいと思います。

全体的な所感

 結果は、5問解いて276位でした。

 個人的にはもう少し頑張れたかも、といった感じです。

FIXERブログ 「SECCON Beginners CTF 2023」で自分が解いた問題と考え方

 知識方面の自分の立ち位置が明確になったのでよかったと思います。自分が知らなかった部分は、他の方のWrite Upを見て勉強しようと思います。

 ひとつ後悔したのは、環境構築をちゃんと行わなかったことです。m1macでやっていたのですが、実行ファイルが実行できない、gdbコマンドが使えないなど、ちょっと不便だった部分が多かったです。次回参加する際はそのあたりちゃんと整えてからやりたいと思います(戒め)。

解いた問題の考え方

crypto CoughingFox2(beginner)

FIXERブログ 「SECCON Beginners CTF 2023」で自分が解いた問題と考え方

 上記コードで生成された暗号文を復号する問題でした。

 最後に配列をランダムにしているからやりにくそう…。しかし、for文の中で2乗したものに配列の添字を足しているので、適当な数を引いて0.5乗した結果が整数であれば、その時引いた数が配列の添字になるはずです。また、2乗されている元の値は、i番目とi+1番目の値が足されたものとなっているので、どこか1文字が分かればほかの値も簡単に決まります。ということで、以下のようにして解きました(自分が考えやすい方法でやっているので、とても汚いですが)。

FIXERブログ 「SECCON Beginners CTF 2023」で自分が解いた問題と考え方

(思いだしながら書いているので、少し違うかもしれません)

 最初のfor文で順番の特定をしています。decoとarrの順番が対応している(という体)です。そのあとのfor文でarrのとおりの並び順にしてます。最後のfor文で文字を特定します。flagの最初の文字は「c」であることが確定している(SECCON Beginners のflagフォーマットはctf4bで始まる)ので、cの文字コードをあらかじめ入れておき、そこから減算で導き出しています。これで文字コードの配列ができるので、あとは文字に直せばflagを入手できます。

pwnable poem(beginner)

 バッファオーバーフローの問題です。以下のような実装しているそうです。

FIXERブログ 「SECCON Beginners CTF 2023」で自分が解いた問題と考え方

 flagをどうにかして出力したいです。main()内でpoem[]の出力を行っているようですが、配列の添字チェックで負数を排除できていなさそうです。*poem[]の前に*flagがあるので、-1から順に負数を適当に入力してみました。結果、-4でflagを入手できました。

web Forbidden (beginner)

 以下のようなページにアクセスしてflagを入手する問題です。

FIXERブログ 「SECCON Beginners CTF 2023」で自分が解いた問題と考え方

 /flagにアクセスすることでflagを入手できるそうですが、/flagがpathに含まれているとForbiddenを返すようです。なにかごまかせそうなものはあるかと、「<」とか「?」とか「#」とかいろいろ試しましたがうまくいきませんでした。わからないと思いながら「/FLAG」と打ったらflag入手できました。理由を後で調べたところ、expressはデフォルトでcase insensitiveらしいです。

 え、マジで?

エクスプレス 4.x - API リファレンス (expressjs.com)

web aiwaf(easy)

 今話題のGPTを使った問題でした。全体のコードが少し長いので、関係があるところのみ抽出します。

FIXERブログ 「SECCON Beginners CTF 2023」で自分が解いた問題と考え方

 パストラバーサル攻撃を成功させれば、flagを入手できるようです。しかし、クエリ文字列を見て、パストラバーサル攻撃かをGPTが判断し、そうであれば入力を受け付けない内容となっていました。最初はプロンプトインジェクションをさせる問題なのかと思い、いろいろと試行錯誤したのですが、うまくいきませんでした。そこでコードをよく見ると、

FIXERブログ 「SECCON Beginners CTF 2023」で自分が解いた問題と考え方

 とあり、どうやら先頭50文字までしかクエリ文字列を見ないようです。ということで、

FIXERブログ 「SECCON Beginners CTF 2023」で自分が解いた問題と考え方

 といった感じで入力してflagを入手しました。

 ちなみに、プロンプトインジェクションで突破する方法もきちんとあったようです。

reversing Half(beginner)

 バイナリファイルを見る問題でした。適当なバイナリエディタ(私はHex Friendを使用)で中身を見ると、以下のように普通にflagが書いてありました。

FIXERブログ 「SECCON Beginners CTF 2023」で自分が解いた問題と考え方

おわりに

 以上が自分が解けた問題となります。あたりまえですが、ここで上げた解法は一部なので、他の解法も様々あるかと思います。ぜひ、他の方のwriteupを見てみてください。

後藤祥仁/FIXER
(ごとう よしひと)
2023年度入社のエンジニアです。
Next.jsをよく触ってます。
どうか、どうか何卒よろしくお願いいたします。

カテゴリートップへ

この連載の記事