こんにちは、26BのFalcon と申します。
4月中旬に開催されたtraP主催の「CPCTF2026」で新入生5位になったので、この記事はその参加記になります。
自己紹介
中学1年生の時に競技プログラミングを始めて、執筆現在AtCoder水です。
CTFは中学2年生の時に少し触れたことがある程度で、そこまで詳しいといえるほどではありませんが、おそらく他の多くの新入生に比べればまだ経験があるほうだと思います。
今回の記事には関係ないことになりますが、高校2年生の時にWeb開発を少し触ったり、3年生の時に文化祭でUnityで音ゲーの開発をしていたりします。
CPCTFについて
アルゴリズムやプログラミングの能力を競う競技、競技プログラミング(CP)とサイバーセキュリティの能力を競う競技、CTF を新入生を中心に色々な人に体験してもらおうというイベントです。
今回のイベントでは、CTF分野にのみ生成AIの利用が許可されています。
また、難易度はLv.1~5に分かれており、配点は、Lv.1は10点、2以上は終了時に解いた人数によって点数が変動します。
Lv.5以外の問題にはすべてヒントがあり、方針がつかめない問題はこのヒントを見て挑戦することができます。
コンテスト結果
2,430点で新入生5位でした。CPCTFには9分野の問題があるので、分野ごとに感想を書いていこうと思います。時系列順にはなっていないのでご承知おきください。
環境
CTFはターミナルが欲しい関係でUbuntuでやるのがやりやすいのですが、デュアルブートはアカウント管理などの観点で面倒です。ということでVitualBoxで仮想環境としてUbuntu24.04を入れていました。メモリとかCPUはWindowsと半々になるくらいに振り分けました。
開始直後に起こった事故
VirtualBoxでUbuntuを動かしていると、動かしていないときにその分ローカルの時間が進んでいないことがあって、コンテスト開始時に2日くらい遅れていました。これによって、CPCTFのフロントエンドがおそらくローカルの時間によって制御されていたので、開始してすぐは問題ページを見ることができませんでした。
まあUbuntuの時間同期をつければよいだけだったのですぐに治りましたが、なんか面白かったので一応書いておきました。
Reversing
実行形式のファイルやバイナリファイルが渡され、そこからフラグを抜き出す問題です。3/4 問解けました。
hidden (Lv.1,10点)
Lv.1なので、bashのコマンドを適当に流し込むことを試みます。有名なのはstrings,grep,catあたりでしょう。ここでは、stringsを試すとうまくいきます。
Omikuji (Lv.2,50点)
バイナリファイルを動かしてみるとおみくじの結果が出て、いい結果であるほどフラグを先頭からより長い部分を見せてもらえます。これを解いていたときは1日目の2時前で眠かったので150回くらい大吉出ないかな~~とターミナルを叩いていましたが、当然うまくいきません。
文字列が直に入っていて、おみくじの結果によって先頭から何文字目までを出力するのかを決めているんだろうな、と想像できます。ghidraというバイナリファイルを解析して中身を見れるようにするアプリがあるので、解析してもらいます。しばらく眺めているとちゃんと直で入っていました。ghidraはCTFにおいて必須ツールなので入れておきましょう。
余談になりますが、ghidraからコピーしてフラグを抽出するのって割と面倒なんですよね、かといって眠いと0とOとか1とlとか見間違えそうなのでコピーしたものをChatGPTにぶん投げました。こういう作業をサッとやってくれるのは助かりますね。
Out of World (Lv.3,50点)
見た目よくわからないですね、ghidraを開きます。何が起こっているのか全く分からないので、頑張ってmain関数を見つけます。そこで呼び出されている関数とか変数を頑張って見つけると、XORで暗号化されていることがわかります。暗号化された文と暗号鍵が見つかるので、そこから復号できます。
ViGor (Lv.4,94点)
ghidraが長い!claudeに色々な関数を投げましたがわかりませんでした。
Crypto
Python(であることが多い)で暗号化された鍵からフラグを入手する問題です。6/7問解けました。
Dualcast (Lv.1,10点)
bytes_to_longという関数で暗号化されています。long_to_bytesという関数を使うと元に戻ります。
Very Exciting (Lv.2,50点)
これめっちゃ難しくないですか?乱数をXORすることで処理されています。key_streamを復元できるとうれしいので、favoriteを0にすると、帰ってくる文字列がkey_streamになるはずです。ただそのあとの処理がわからなかったのでChatGPTに投げました。なんとなく解法がわかっても結局何をすればいいのかわからないことが多いのは経験不足だなぁという感じがします。というかLv.3以降に関してははほとんどの問題でなんかしらの形で生成AIを使っているはずです、悲しい...
1,0,7 (Lv.3,50点)
Nが1....1で割り切れるので、p,qが特定できます。RSA暗号の本質はp,qが現実的な時間内に求められないことなので、実質これで解けたことになります。
ちなみにp,qがわかっても解き方を実装できるわけではないのでclaudeに投げました。
Anomaly 2 (Lv.3,50点)
一見普通のRSA暗号です。困りましたね。さっきの問題のコードと比較してみて変なところがないか探してみると、nとmが逆っぽいです。これを指摘してChatGPTに投げると、解いてくれます。
Janken Master (Lv.3,50点)
seedにXORをかけている数を入力すると全員がグーを出してくれます。最初自分はグーを出してしまい、100人全員がグーを出すことによるあいこが発生してしまいました。どういう確率でしょうか。
パーを出せば勝てます。
Bitwise Scribble (Lv.4,50点)
3つに分けて暗号化がされていますが、実は全部XORしているだけです。復号の仕方はよくわからないので、claudeに投げました。
mod N Janken (Lv.5,138点)
問題を見ていない気がする... Lv.5はヒントがないことからあまりちゃんと見ていない問題が多いです。Lv.5の中では割と配点が低いほうだった気がします。
Forensics
メモリとかファイルとかからフラグを入手する問題です。5/6問解けました。
L0v3 PDF (Lv.1,10点)
あんまりおぼえてないです。stringsをすると解けた気がします。
Flag in Flags (Lv.2,50点)
画像ファイルが与えられます。昔の記憶で特定の色だけ抽出するテクニックがあったのを思い出したので、調べると、ステガノグラフィというものが出てきます。
昔はWindowsでうさみみハリケーンというアプリを使っていたと思うのですが、今回はブラウザでいいものを見つけたのでこれを使いました。
使うと解けます。
Secret Recipe (Lv.2,50点)
wiresharkで、follow TCP streamというものを使うと解けたと思います。詳しくなにをしたかは覚えていないです。
credentials (Lv.3,50点)
gitはよくわからないのでヒントを見ます。それでもよくわからないので問題文に書かれているコマンドとヒントをChatGPTに投げると解けます。
digest (Lv.3,50点)
「サーバーにはレートリミットがかかっている」という表現が気になります。手元で動かせば数字8桁くらいローラーできそうですね。どうやるのかはわからないのでChatGPTに投げると解けます。
Authorized Whale (Lv.5,216点)
見てないと思います。
Misc
所謂、その他に分類される問題です。なんでも出ます。4/5問解けました。
Sanity Check (Lv.1,10点)
Discordを見ると、解けます
Feedback Servey (Lv.1,10点)
アンケートに答えると、解けます
Hello LaTeX3!!! (Lv.3,50点)
問題の中身を見なくても作問者がわかる問題です。
コードを見ると、clistという見たことない言葉が出てきます。 expl3のドキュメントでこれを調べてみると、いくつかの候補が出てきます。それっぽいのをいくつか入れてみると1個当たります。
QRRRRRRRRRR (Lv.3,112点)
最後まで解けませんでした。ヒント通りにQRazy boxを試してみるのですが、うまくいかず、色々な生成AIに解かせてみましたが、これもうまくいきませんでした。
この時答えと全然関係ないようなフラグを出力してきたり、リックロールが出てきたことにされたりしました。そうはならんやろ。
Damaged Report (Lv.4,169点)
ファイルをclaudeに投げたらサッと解いてくれた気がします。ちなみにReversingの問題とかはほかの人がファイルごと渡したらすぐ解いてくれたみたいなことを言っていたのでそういうことをした方が強いのかもしれません。ただそれだと何をしたら解けたのか全然わからないのでどうしようもないとき以外は考察を色々挟むようにしていました。
まあファイル丸ごと渡すのをここまで思いつかなかっただけなんですが。
OSINT
合法的な(SNSなどを使って)検索することで解ける問題です。2/3問解けました。
IRIS OUT (Lv.2,50点)
IRIS OUT 紅白 場所
とかで調べると、大体の場所が出てきます。快活CLUBと、カラオケ館と、青看板の場所から特定できます。
PENGUIN (Lv.2,50点)
ヒントを見て、名古屋港博物館を調べると、ペンギンのラベルの記事が出てきます。これを見ると解けるはずなんですが、自分は黄色が赤に見えていたので解けませんでした。悲しい。
Night View (Lv.3,50点)
奥の方にレインボーブリッジっぽいものが見えるのと、手前の方に五十嵐冷蔵と書いてある建物があるので、これらから大体の位置が推測でます。撮っている場所がかなり高そうなので、田町駅周辺の高い建物を調べると、特定できます。
PPC
競技プログラミングです。9/14問解けました。競プロメインの顔をしているのでもうちょい解きたかったですね。
Modulo Equation (Lv.1,10点)
最小値が10^5以下であることが保証されているので、全探索をすると解けます。
Sign up for traP (Lv.1,10点)
書いてあることを実装すると解けます。
01 String (Lv.2,50点)
0....01....1 の形をしている(0が1つ以上、1が1つ以上ある)ものについて、その長さをNとしたとき、この長さNの文字列の状態数はN+1通りあります。文字列全体について、これらをかけ合わせれば解けます。
考えの主軸がわかりづらく、Lv.2の割には結構難しかった気がします。
Bracket Stack Query 2 (Lv.2,83点)
左の方から文字を追加すると、(|)が完成したら消すことで、追加していくときは問題ないことがわかります。
次に削除していくときは、基本一番右の記号を消せばよいのですが、(|)が完成したあとに削除が来ると、(|を追加する必要があります。各操作後に文字列の長さを記憶しておくことでこの処理をするような分岐を作ることができます。
これ01 Stringより解かれてないんですね、かなり意外。
I Love DAG (Lv.2,50点)
数字が小さい方から大きい方に辺を張ることで条件を満たします。
Digit Products 2 (Lv.3,106点)
最上位の数字は0でないことが確定しているので、最上位の数字とそれ以外の位の数字を掛け合わせたものを1つずつ聞くことで、返答が0でないものが2つ以上あった場合はそのような桁2つを聞くことで決定します。
1つのとき、1,25,49,64,81のときのみ1通りに絞れます。
0個の時は最上位の数字が何かわからないので絞れません。
GCD Knapsack (Lv.3,106点)
GCDの方を固定することで、N*(1~Nまでの逆数の総和) 程度まで計算量を抑えられます。
Insert Maze (Lv.3,128点)
途中で間に列とか行を挿入することを考え始めると難しそうだなぁと思うので、最初に全部列と行を挿入しておきます。
すると、1行・列、飛ばせるか飛ばせないかを制御することでうまく解けます。
これ多分想定解と違うんですよね、物理学演習なら別解で点数がもらえそうです。
Sum of Prod of Root (Lv.3,178点)
なんで解けていないのかわからないです、だれか教えてください
3乗根以上のところは愚直に計算しても間に合うので、2乗根以下のところをO(1)で求められるようになりたいです。
floor(sqrt(N))を求めると、Nがこれの2乗のときはwolfram alphaとかに投げるとすぐに求めることができます。
ここまでできてれば解けるはずなんですがね....なんで解けないんでしょうか。
All Distance is Square Number (Lv.4,216点)
少し考えることで、(1,k)に2*k-3の辺を、(2,k)に(k-1)^2の辺を張ることでうまくいくことがわかります。とはいえ200までしか使ってはいけないのでこのままでは解けません。
ここで、奇数の辺を使って2まで戻っていき、そこから飛ぶことでうまくできないかを考えてみると、(2,k)に2*k-2の辺を張ると先ほどと同じような方法で解くことができます。
OR mapping (Lv.4,211点)
強連結成分分解というアルゴリズムを使うと解くことができそうですが、最終日に2問前の問題が解けないと順位が上げることができない状況になり、それが解けなかったのでこれも解いていません。
基本的に奇数のサイクルがあれば可能で、そうでない場合は不可能なんですが、強連結成分が1つの頂点のみから構成される場合、それが2連続だったり一番最初の成分だったりしない限り可能だと思います。
RangeSum RangeUpdate RangeSqrt (Lv.4,206点)
期間中は解法がわかりませんでしたが、3日くらい後に風呂に入っていると解法が浮かびました。
1e18までなら、sqrtを5,6回することで1になります。この差分を乗せる遅延セグ木を作れば解けると思います。
RPS Eliminations (Lv.5,292点)・Get More Money (Lv.5,263点)
わかりません。
Pwn
サーバーで動いているアプリにローカルからアクセスして脆弱性を見つける問題です。4/5問解けました。
Killionaire (Lv.1,10点)
個人的Lv.1最難枠でした。Pythonファイルを見ると、現在持っている金額以下の金を賭けられる設定になっていますが、負の金額を賭けると、負けた分金額を取られるので、大量に儲けることができて、解けます。
Buffer Visualizer (Lv.2,50点)
普通に入力するとBufferの層で止まってしまいますが、十分に長い文章を打つと貫通することがわかるので、targetを書き換えることができます。
campaign (Lv.3,64点)
よくわからなかった...claudeに投げたら解いてくれました。
coding agent (Lv.4,88点)
よくわからなかった...claudeに投げたら解いてくれました。
diary (Lv.5,206点)
珍しく中身を見たLv.5です。ソースコードが長すぎてすぐあきらめた気がします。
shell
terminal上でごちゃごちゃすると解ける問題です。(多分)3/3問解けました。唯一完答したジャンルですね、嬉しい
ssh (Lv.1,10点)
ターミナルからssh接続をして、catを使うと解けます
ssh2 (Lv.2,50点)
1個前とほとんど同じ問題なのですが、catが使えなくなってしまいました。grepを使いましょう。
CPCTF jail (Lv.3,50点)
jail問題といわれる、特定の文字しか使うことができない環境でflag.txtを開く問題です。その上、1回しかコマンドを打つことができなかったと思います。というわけでディレクトリの移動も封じられてしまいました。困った...
ここで頼りになるのは、エラーメッセージです。例えば、cpctf みたいなコマンドを打つと、cpctf っていうファイルはないよ~、みたいなエラーメッセージを返してくれます。これをうまいこと使って解いていきます。
まず試したのは、 * です。あまりbashに詳しいわけでもないので推測になりますが、このコマンドを打つと、現在いるディレクトリの中でアルファベット順で最も若いファイルが実行されようとするようです。これでは、jail.py へのアクセス権限がないよーと言われてしまいます。
1問目と2問目の感じから、なんとなく /flag/flag.txt にフラグが隠されている気がします。というわけで /f*/* というコマンドを試してみると、/flag/flag.txt へのアクセス権限がないよーと言われます。
ということでファイルにアクセスするとこまではいけました。
この後はbashの記号一覧を睨みながら色々試した記憶があります。
最終的に、 $(</f*/*) を実行するとうまくいきました。間違いなくCPCTFの中で一番時間をかけた上、面白かった問題だと思います。こういうのを自力で解けると感動します。
Web
Webに関することなら何でも出ます。(多分)6/8問解けました。個人的にかなり苦手な分野で、ほとんどで生成AIを使いました...。
mirage (Lv.1,10点)
全部コピーすると1個正しいものが釣れます。
Hidden Recipe (Lv.2,50点)
これ、「隠された」と「秘伝」で掛けられていて面白い。
問題自体は全然わからなかったのでclaudeに投げました。
Let's remove script tag (Lv.2,50点)
ヒントを見るとやるべきことが結構書いてあります。webhookいつもありがとう。
Z (Lv.2,50点)
サイトを開くとaaaaというユーザーが、「なんか入れた」みたいなポストをしているのを発見できます。パスワードもaaaaで入ってみると、なんとおそらくクリア済みのユーザーのアカウントを乗っ取れて、フラグを入手できます。
これをCTFをやっていいんですかね...ま、まぁ...一応脆弱性をついているので...
tar me (Lv.3,109点)
claudeに丸投げしたと思います。
CPCTF market (Lv.4,238点)
webhookでうまく釣れないかな~と思いましたがclaudeに聞いてもうまくいかず...
Template Playground (Lv.4,157点)
claudeに丸投げしたと思います。
Physical CTF (Lv.5,142点)
多分見てないです。
まとめ
後半点数が欲しくなってclaudeに投げた問題が結構多いですね...
せめて解法くらいは自力でたどりつけるようになりたいです。それとPayloadを組む能力が足りていないなぁと実感しました。
自分はCTF班に所属する予定なのでこれからそういった点を頑張っていけたらなと思います。