こんにちは、25Bのくあらんてぃんです。4/18~20に開催されたCPCTF2025に参加したのでWriteupというものを書いてみます。
CPCTF の詳細を知りたい方は運営陣の紹介記事を見てください。
開始前の取り組み
競プロ
競技プログラミングは高校でもやっていてアルゴリズムはAtCoderで緑です。Python使いです。水以上の新入生もたくさんいそうなのでこわかったです。
CTF
未経験でしたが、予習してもいいらしいので1週間前から少し勉強してました。

先輩方に教えてもらった記事やCTFのサイトを見て予習しました。CpawCTFをLevel 3の終わりまでやる過程でWSLやGhidra、Wiresharkなどをインストールしたりしました。また、traPのハッキング体験会にも参加しました。そこで扱われた手法が実際に問題でも使えたりしたのでアツかったです。(僕は解けなかったので悔しい!!)
先輩方に教えていただいたtraPブログの記事を貼っておきます。
traPブログは最強らしいのでブログ検索窓でCPCTFなどと検索するともっといろいろ出てきます。
課題
CPCTFをガチるなら課題を終わらせておけという先輩方の金言(遺言……?)に従ってしっかりとすべての課題を終わらせておきました。(えらい)
結果
2377.05点で全体28位 / 新入生3位でした。永遠に楽しめそうなくらい問題数が多く、もっと解きたかったです。さらに上位を目指すなら得点減少が少ないヒント2まで開けてから解けそうな問題に取り組むのもありだったと思います。
ここから解けた問題を問題一覧の順に書いていきます
Lv.1
【PPC】 45^2
print(int(input())**2)
でした。競プロはyukicoderで行われるので、事前に使っておくとスムーズかもしれません
【Misc】 Feedback Questionnaire
いつの間にか新しい問題ができてて終わりのほうに解きました。アンケートを書いたらフラグがもらえます。時間がなかったので適当に回答してごめんなさい。あとでもう一回回答しました。
【Crypt】 Heroic Code
シーザー暗号でした。CpawCTFでやったやつだ!!ツール検索して突っ込むとフラグが手に入りました
【PPC】 Luke or Bishop
LukeかBishopを使って (0, 0) から (x, y) に移動するには最小で何手かかる?という問題。競プロの基本は(おそらく)実験です。最大2回で絶対たどり着きそうなのでコーナーケースを書いてACです
【Misc】 Sanity Check
フラグが書いてあるチュートリアル問題でした。提示されているCTFのDiscordサーバーには必ず入っておきましょう。おそらく最初に解かれるべき問題なのに、問題一覧が辞書順っぽいせいで中途半端な位置にあるという仕様なのはいかがなものか
【Binary】 What's this?
謎のzipファイルが渡されます。zipファイルを開くとwordと書いてあったので拡張子をdocにして開いてみるとフラグが出現。
docとdocxってどれくらい違うのだろうか
【Forensics】 dark
真っ暗な画像が渡されます。写真アプリでいろいろ加工して、明るくしたらフラグがみえました
【Forensics】 meshitero
丼ものの写真が渡されます。パソコンからでもGoogle Lensが使えることにおどろき
飯テロされたのでここでご飯食べた気がする
【Shell】 netcat
ncコマンドのチュートリアルです。教えられたコマンドを実行すればいいらしい。
WSL入れておいたのでそれを使ってみました
Lv.2
【Pwn】 2025
C言語のプログラムと問題サーバーに接続するncコマンドが渡されます。Pwnableではソースコードを読んでフラグの獲得手段を探し、そのプログラムが稼働する問題サーバーへ攻撃することでフラグを獲得する、という形式が多いようです。見てみると、2025の約数でない2つの整数の積を2025にすればフラグがもらえるらしい。一見不可能なのでオーバーフローさせたい。int型の上限を調べて2025足したやつを素因数分解
【Crypt】 Add and multiple
暗号化のプログラムと暗号文が渡されます。復号化では暗号化の逆のことをやるので、割って引くと平文が得られるはず。割り切れるnを見つけて余りを引くようなプログラムをPythonで書きました
【Shell】 Count CPCTF
巨大なテキストファイルが渡されるので、テキスト中のCPCTFの数を提出する問題。Shellにはgrepというコマンドがあるのでそれを使えばできそうです。CPCTFで提供されているWebShell環境を使ってみようと思ったのですが、コマンドオプションを間違えてヒット数ではなくヒット箇所を表示させてしまい、大量の出力のせいか切断されてしまいました。
仕方がないので、より慣れているPythonのreでカウンターを書いてフラグゲット
【Binary】 Guessing
pycファイルが渡されます。Pythonのファイルらしいです。バイナリをみてもわからない。実行するためにPythonをアップデートしたり、調べて出てきた逆アセンブラであるuncompyle6などを入れたりしたがどれもうまくいかないので諦め。戻ってきて、さらに調べるとPythonには標準でdisというモジュールがあるらしく、それを使うことで逆アセンブルされたものが得られた。アセンブリは読めなかったのでGrokに投げてコードにしてもらい、フラグゲット。やったね
【Pwn】 INTelligent
Cのプログラムが渡されます。intに関する小問3連発みたいな感じ。それぞれ頑張って調べてソルバーを書きました
【PPC】 Like CPCTF?
渡される文字列の部分文字列で、CPCTF的な文字列の定義に合うものの個数を数える競プロの問題。むずそうだけど制約が小さいのでごり押し全探索
【Web】 Name Omikuji
名前を入力して運勢を占うWebサイトのリンクが渡されます。プログラム読むと、名前のsha256の0の数で運勢が決まり、大吉だとフラグがもらえるらしい。sha256がすべて0になる文字列を探すプログラムを書いたりしたが、らちが明かない(当然)ので悩みました。ジャンルがWebなので実装のフレームワークに脆弱性がありそうだと考えて、「Flask 脆弱性 CTF」などで調べたらそれっぽいものが見つかった気がする
【Misc】 Painting Break
PSDファイルが渡されます。GIMPで開けていろいろいじっても全然出てこないのでめっちゃ悩んでいました。血迷ってヒント1を開いてしまったが、案の定PSDファイルの説明が書かれているだけで後悔。コンテスト終盤にスマホのibis Paintで開けていじってたら暗い文字で何か書かれてるのを見つけて無事クリア
【Binary】 Secret Key
拡張子のないファイルが渡されます。テキストエディタで無理やり開くと先頭にELFと書かれていたので、事前に練習した通りGhidraで見ます。確かフラグを見るためのSecret Keyを簡単に見つけることができたので、実際に実行してそれを入力することでフラグゲット
【PPC】 Swap members
配列でK離れた要素同士を入れ替えることができるとき、目標の配列にできるかという競プロの問題。modが同じ場所には自由に動けるなぁ~と感じたのでBeforeとAfterをmod毎に比較した
【Shell】 XFD
指定された通りに巨大なファイル作ってそのsha256を答える問題。もちろんShellわからんのでPythonで書いた。CRLFとLFの違いがよくわからんくて大変だった。あとsha256を大文字で返す関数たたいてしまって間違えたりするなど
【OSINT】 timetable
バスの時刻表が渡されるのでバス停の名前を提出する問題。個人的には本数が少ないと感じた。ルート名が載っているので検索をかける。路線が特定できたので始発の時刻からバス停も特定
Lv.3
【PPC】 0→1
与えられる文字列の、任意の長さ2以上の連続部分文字列について0の数を1の数以下にするために、変更するべき最小の文字数を答える競プロの問題。実験してみる。前からみていき、0があったらその後11が続けばよさそう
【Crypt】 Anomaly
RSA暗号。p, qが与えられるので普通に解読できそう……?
【OSINT】 Bench
4コママンガのあるベンチの写真が渡されて、その場所を提出する問題。4コママンガが街にあるってことはゆかりがありそう&後ろに乗船券うりばとフェリーのりばの標識がみえるのでそこからいけそう。市がわかったらGoogle Mapsでひたすら港沿いをストリートビューしてた。写真にも写っている特徴的なガードレールをみつけたのでその周りよくみたらあった
【Shell】 Chase the flag!
膨大な量のファイルが入っているzipが渡される。各ファイルには「フラグは{{ ファイル名 }}にいるよ」という風な文章が書かれている。つまりフラグとの追いかけっこである。
とりあえず"CPCTF{"で検索するも対策済みでダミーフラグのファイルもたくさんヒットしてしまう。ファイル内に次のファイル名が書かれているので、Pythonでファイル名を検索して開くのを繰り返すようなプログラムを書くが何故かみつからない。手動でたどってみると数ファイル目に複数の行先が書かれたフェイクを発見。つまり最初にヒットしたもののみを探索していたために失敗してたのだ。ダメ元でもう片方のファイル名を初期値にして実行したが失敗。reのメソッドとしてsearchじゃなくてfindallを使い、DFSみたいなのを書くことで無事フラグに追いついた
【PPC】 Decrement or Mod Game
Alice, Bobの二人が数字を持ち、
- 自分の数を1減らす
- 相手の数で自分の数の剰余を取る(自分 > 相手 のときのみ可能)
のどちらかの操作を交互に行い、先に0にするゲームの勝敗予想。実験してみると数字が小さいほうは1減らすことしかできなく、大きいほうは相手が1のときに剰余を取れば常に勝てる。初期値が1付近とA=B付近にコーナーケースがありそう(1敗)なのでそれを処理してAC
【Forensics】 Golden Protocol
pcapファイルが渡されるのでやっとWiresharkの出番。中身を調べるとメール通信らしく、本文っぽいものをUnicodeに戻すとPPAPらしいことがわかる。パスワードが書かれたメールがないと勘違いして鍵付きZIP解読ツールいれて走らせてしまった。解読を待ってる間にもう一度見たら普通にパスワードあったのでそれを入力して無事フラグをゲット
【Forensics】 I love MD
Markdown関連かと思ったらMD5のハッシュをぶつける問題。調べてでてきた文字列を入れた
【Misc】 LLM-powered Scheduler
LLMがいい感じに日程を考えてくれるスケジューラサイトが渡される。実装がPHPだったのでてっきりPHPの脆弱性かと思い、いろいろ試したがわからず。仕方なくヒントを開けたらプロンプトインジェクションらしいので脅迫したら教えてくれた
【OSINT】 Lethal
とある事件の原因となるウイルスが悪用しているCVEを探す問題。事件内容で検索すると記事が出てくる。そこにCVEが2020年1月あたりと出ているので頑張って探す。CVEをググったりしてもマルウェア名が出てこないので海外の記事のほうを頑張って探す。英語の記事をみてもいまいち何もひっかからないのでドイツ語かな~などと思いながらGrokのDeepSearchに聞いてみるとあっさり教えてくれた
【Shell】 Math Test
計算問題をがんばるだけ
【Web】 String Calculator
計算式をexec()で計算してくれるWebアプリが渡される。getFlagという関数があり、それを実行したいのだがエスケープされてる括弧を使わずに実行する方法がわからない。どこにも情報がなくAIにしつこく聞いてたらバッククオートで代わりになると教えてくれた
【PPC】 Toll Optimization
重み付きグラフの最短経路問題だが、指定回数()だけクーポンを消費して辺の重みを0にできる。DPっぽいので残りのクーポン数も状態に持っちゃえばいいのでは!?という発想が割とすんなりとでてきた。うれしい
【Misc】 correctionless
QRコードは勉強したことあるのでできそうなのは分かったけどめんどい。ペイントでシンボルとかを適当に付け足すだけでQRリーダーが認識してくれないかな~と思ったけどそんなに甘くない。ツールを探してQRazyBoxというのに入れる。右上の「回」の下側で誤り訂正とマスクの正しい組み合わせがわかるので、解読機能を使ってフラグゲット

Lv.4
【Forensics】 Cached LLM
確かLLMアプリとソースコードが渡される。馬鹿なので再びプロンプトインジェクションを試す。結局わからずにヒント2まで開けてハッシュ衝突だと知る。衝突させたいキャッシュのハッシュを見つけてツールを使って探した文字列を突っ込めばゲット
【PPC】 More and more teleporter
最初は上り坂、テレポーターがあると蟻地獄みたいな感じ
【Crypt】 RSA Trial 2025
writeupで見たことあるような問題だ!ってなった。素数p,q,rを使うけどrはp+q以上の最小の素数らしい。等式3つの三元連立方程式かと勘違いして解こうとしたりした。大体のrを求めてから近い範囲を探索してみたらなんかいけた
【OSINT】 yellow_train
Google Lensで路線はわかったけどその後がわからない。Google Mapsで延々と線路の航空写真から場所を探そうとしたけどらちが明かないのでヒントを2つあける。配線図というものをのせてくれてるサイトがあったのでそこから線路が複雑になってそうな感じの駅をGoogle Mapsに突っ込むのを繰り返してたら無事ヒット。撮った場所かと思って何回か誤答したけどちゃんと問題文読み返してクリア
Lv.5
【OSINT】 Chaos Town
何度もいったことがあるので渋谷であることだけはわかった。
右下の広告から大体の時期が絞れて、画像検索で見つかった2022/4/19のブログに右奥の壁の高さが少し違う写真があったのでそのあたりだと見当をつける。これが間違ってた。
3回くらい試してみてもあたらなかったところで、Xでの検索を思いつき、渋谷駅とか東急東横店とかで時間指定検索するともっと前であることが判明。ここでヒントを開けてYouTubeというメディアの存在を思い出す。
手前に水滴があるので天気でも調べていく。3/19の雨の中散歩している動画を見つけたことと、雨の日の次に晴れるのが3/20と3/24だったので、この2つをローラーするがあたらない。
点数が下がってしまったのでヒント開けたら3/19だった。おしい
【OSINT】 Sweets
Xの画像を調べようと思ったけどGoogle Lensでみつからないのでヒント開けた。
今思うと、夜遅くて判断が適当になってた気がする。夜は寝ましょう。
Google画像検索したら出てきたのでブログを見る。
去年のwriteupでメールアドレスを調べたというのを思い出して一応調べてみるが何もない。
ここでヒント2つ目を開ける。
CTF OSINT ツールみたいに調べてでてきたID検索ツールをインストールしてXのIDとブログのAuthorを入れてみるが何も出てこない。
ここでヒント3をあけてしまう。ヒント適当に使いすぎ。
メールの@以前の部分をいれると書いてあってなるほどーってなった。YouTubeアカウントが見つかるのでそこからはがんばる。
おわりに
CTFめっちゃ面白かったです!!!
これからもいろいろと精進していきたいと思います
運営の方々、本当にありがとうございました!!