feature image

2025年5月1日 | ブログ記事

先輩方もすなるWriteupといふものを、新入生もしてみむとてするなり。

こんにちは、25Bのくあらんてぃんです。4/18~20に開催されたCPCTF2025に参加したのでWriteupというものを書いてみます。

CPCTF の詳細を知りたい方は運営陣の紹介記事を見てください。

開始前の取り組み

競プロ

競技プログラミングは高校でもやっていてアルゴリズムはAtCoderで緑です。Python使いです。水以上の新入生もたくさんいそうなのでこわかったです。

CTF

未経験でしたが、予習してもいいらしいので1週間前から少し勉強してました。

部内SNSでの私の投稿「CPCTFにむけてCTF先取り学習するのは犯罪ですか?」に対して、先輩方が「NO」「偉い」「合意」などのリアクションをつけてくださっている。
先取り学習は合憲です

先輩方に教えてもらった記事や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

いつの間にか新しい問題ができてて終わりのほうに解きました。アンケートを書いたらフラグがもらえます。時間がなかったので適当に回答してごめんなさい。あとでもう一回回答しました。

【Crypto】 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足したやつを素因数分解

【Crypto】 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が続けばよさそう

【Crypto】 Anomaly

RSA暗号。p, qが与えられるので普通に解読できそう……?

【OSINT】 Bench

4コママンガのあるベンチの写真が渡されて、その場所を提出する問題。4コママンガが街にあるってことはゆかりがありそう&後ろに乗船券うりばとフェリーのりばの標識がみえるのでそこからいけそう。市がわかったらGoogle Mapsでひたすら港沿いをストリートビューしてた。写真にも写っている特徴的なガードレールをみつけたのでその周りよくみたらあった

【Shell】 Chase the flag!

膨大な量のファイルが入っているzipが渡される。各ファイルには「フラグは{{ ファイル名 }}にいるよ」という風な文章が書かれている。つまりフラグとの追いかけっこである。

とりあえず"CPCTF{"で検索してみるが、対策としてダミーフラグが書かれたファイルがたくさん用意されていたため失敗。ファイル内に次のファイル名が書かれているので、正規表現でファイル名を抽出してそのファイルを開くことを繰り返すPythonプログラムを書くが「ここにフラグは来てないみたいだよ」というファイルに到達してしまい、何故かみつからない。とりあえず手動で数ファイル辿っていくと「フラグは{{ ファイル名1 }}か{{ ファイル名2 }}にいるよ 」というような複数行先形式のファイルを発見。正規表現の設定で最初にヒットしたもののみを探索していたために失敗してたのだ。手動で探索するのも難しそうだったため、正規表現のメソッドとしてsearchじゃなくてfindallを使い、DFSみたいなのを書くことで無事フラグに追いついた

【PPC】 Decrement or Mod Game

Alice, Bobの二人が数字を持ち、

のどちらかの操作を交互に行い、先に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というのに入れる。右上の「回」の下側で誤り訂正とマスクの正しい組み合わせがわかるので、解読機能を使ってフラグゲット

若干ずれてるって?それでも読み取れるのがQRコードですよ

Lv.4

【Forensics】 Cached LLM

確かLLMアプリとソースコードが渡される。馬鹿なので再びプロンプトインジェクションを試す。結局わからずにヒント2まで開けてハッシュ衝突だと知る。衝突させたいキャッシュのハッシュを見つけてツールを使って探した文字列を突っ込めばゲット

【PPC】 More and more teleporter

最初は上り坂、テレポーターがあると蟻地獄みたいな感じ

【Crypto】 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めっちゃ面白かったです!!!
これからもいろいろと精進していきたいと思います
運営の方々、本当にありがとうございました!!

quarantineeeeeeeeee icon
この記事を書いた人
quarantineeeeeeeeee

くあらんてぃーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーん

この記事をシェア

このエントリーをはてなブックマークに追加
共有

関連する記事

2021年8月12日
CPCTFを支えたWebshell
mazrean icon mazrean
2021年5月19日
CPCTF2021を実現させたスコアサーバー
xxpoxx icon xxpoxx 他
2021年5月16日
CPCTFを支えたインフラ
mazrean icon mazrean 他
2019年4月22日
アセンブリを読んでみよう【新歓ブログリレー2019 45日目】
eiya icon eiya
2023年4月29日
CPCTF2023 PPC作問陣 Writeup
noya2 icon noya2 他
2023年4月21日
CPCTFを開催します
noc7t icon noc7t 他
記事一覧 タグ一覧 Google アナリティクスについて 特定商取引法に基づく表記