2022/05/01 に開催された CPCTF22 で、新入生内4位を取ったので記録と感想を残そうと思います。
自己紹介
はじめまして。22Bのたけです。この記事は参加記録なのでCPCTFに関係ありそうな事だけ軽く書きます。
競プロ歴:
- AtCoder: 元水コーダーです。今1100くらい。
- JOI: 予選通過して本選に出れるくらいです
あとCTFを高校の頃本当にちょっとだけやった事があります。(チュートリアルみたいなのを解いたくらい)
始まる前の戦略などなど
- 流石に新入生の中では(現時点では)できる方だから新入生で上位入賞をしたい!
- 問題ジャンル一覧が載ってたので、始まる前に各ジャンル1問ずつ触ってみた。 Pwn が中々ハード。
- ヒントは2つまでなら見ても大して減らないのでバンバン見ていく事にする
- 競プロカテゴリだけじゃ勝ち目がない(同期に暖色コーダーがうようよいる)ので、CTFを頑張る
- でも流石にPPCのEasyくらいは余裕やろ~w
結果
- PPC(Easy~): 0完 競プロにわかとして生きていきます。
- 点数は2,806.39で新入生4位、全体21位でした。(やったー!)
- 解いた問題はこんな感じ。(Newbieは全完、Medium以上は一問も開かず。)
問題別のメモ
ざっと解けた問題、解けそうだった問題について自分の感想、反省点などをジャンル別で並べ続けていこうと思います。ネタバレあり。
凡例
#### <問題タイトル>: <o 正解, x 正解できず, - 挑戦しなかった>
Crypto
My Own language: o
手作業でやるのは中々しんどいし、エディターの置換も厳しい。ので、ヒントを開けて「換字式暗号 ツール」でggる。→お、いい感じのサイトあるじゃん。であとはモクモク。最初の Ya!
を Hi!
と決め打ってしまい時間がかかった。
RSA Warmup: o
415411 素因数分解でggってあとは頑張る。
PHE 1: o
問題文みてPwnみたいな見当違いの事考えてた。Cryptoってカテゴリーに書いてあったしなぁ…。
PoweRSA: x
p,qが求まったのにそこから先で詰まってしまった。pythonが gcd(e, l) = 1 を満たす数字をうまく持ってきてくれなかった。決して僕のせいではない。
xxorxx: o
ノータイムでヒントを見てしまったけど、ちゃんとコードを見たらやる事は単純だった。pythonで decoder を書く時に byte <=> string の変換でちょっと苦労した。
Forensics
sunset: o
exiftool、手元のlinuxに入ってなかったから webshell 起動した。
Dive!: o
Dockerの中身こんな感じだったんだ、はへー。
Deeper: x
手元のflagメモが CPCTF{...hidden..._us3fu1}
なんだけど最後の単語が多分3-4文字足りてない(successfulになりそう)。 多分見るところを間違えた?
tourist出しした関係で、どうやってこのフラグを手に入れたのか思い出せず…。tourist出ししてしまったのをちょっと後悔。
そのあとは画像からbinwalk使ってファイル切り分けでそれを3回くらい展開したんだけど、ascii text, with very long line みたいなファイルで詰まった。google先生によればなんかの圧縮ファイルらしいんだけどよくわからず…。
png...?: x
どっかを直せばいいんだろうけどどこを直せばいいのかよくわからないしめんどいのでパス。exiftool が corrupted って表示してくれるならautofixツールみたなのあってもよくね?
Misc
Eagle: o
ヒント2を開いてようやく解き方を理解した。
Mellon: x
モールス信号だなぁ、って思って適当に変換かけても英文にならず。問題文にドイツ語って書いてあるのあとから気づいたけど、残り時間が5分とかだったのでタイムオーバー。
This is Flag!!: o
アラビアみたいなやつで使う記憶。LINE でこれで遊んでる人がいたのが懐かしい。 VSCodeに貼り付けて、左から文字を順番に打ち込んだらACした。
click: -
問題見てません…。
the luck 1: o
まぁ時間さえわかれば乱数決まるんだろうなぁ…。と思ってやったけど秒数をあわせるのが下手くそで結構手間取った。
the luck 2: x
へえ、pythonもなんかあるのか。メルセンヌ・ツイスタ、ほーん…624回答えみないとわからない!? まじか。
→ pwntool がうまくインストールできず、うまくsolver? をかけなかったのでここでギブアップ。624回会話するのも流石に面倒だし。
OSINT
Welcome to OSINT! 1: o
はい。
Welcome to OSINT! 2: x
Twitter で検索をかけると https://twitter.com/nmink615 がヒットするけどなんいもない。22年3月作成だしこれっぽそうなんだけどなぁ…。記事のドメインについてた nm615 で検索かけると全然関係なさそうな人がヒット。最終的には答えを見てもアカウントを見つけられず。
Hacker: o
Onion Browserを入れた。サイトの中身が想像以上に簡潔すぎて困っちゃったけど、ソース見た時に :8000
って書かれてるのが怪しすぎてそのへんを色々見たら無事にflagを発見した。
illumination: o
Googleに検索頼んだら近そうなサイトがヒット。そこからGoogleMapでユニクロの情報を使いながらどの通りかを探して通りの名前を確定。最後通りの読み方を間違えて少し手間取った。
PPC
Addition Construct: o
a=N-1, b=1 にして見事に WA
が出ましたね。かなしい
Nkuth's Plus Notation: o
問題文が理解できなさすぎて解答を見た。この性質面白い。
State of the clock: o
まぁ特に詰まることはなく。
Garbage Bags Optimization: x
えー…。解けなくてごめんなさい。O(N) まで落とせてるはずなんだけど TLE
しまして。コード貼るので何がおかしいか見つけてください。僕はあとで先輩から教えてもらおうと思います。
#include <iostream>
#include <string>
#include <vector>
#include <algorithm>
#include <numeric>
using namespace std;
int main() {
int n,k;
cin >> n >> k;
int a[n];
for(int i=0; i<n; i++) {
cin >> a[i];
}
long long ansl = 0;
long long ansh = 1000000000000000;
while (ansl != ansh) {
long long mid = ansl+ansh;
mid /= 2;
long long now_garbage = 0;
long long used_box = 1;
for(int i=0; i<n; i++) {
if(now_garbage + a[i] <= mid) {
now_garbage += a[i];
}else {
cerr << "used-at " << i << endl;
used_box++;
if(a[i] > mid) used_box += k;
now_garbage = a[i];
if(used_box > k) break;
}
}
if (used_box > k) {
ansl = mid+1;
}else {
ansh = mid;
}
// cerr << used_box << ":" << ansl << " " << ansh << endl;
}
cout << ansl << endl;
}
Mogumogu Pakupaku: x
えー…解けなくてごめんなさい。ってか、これに関してはちょいC++にとってむずくないですか?最大で 1020 s まで来る可能性があって、それをオーバーしたらまずいのに long long じゃ 1020 までしか扱えず… ヒントを見てもこれを回避する方法が載ってなくて詰んだ。2問連続で詰まっちゃったのでPythonで書く気力もなく。うまく扱えば最大値は 1010 s 以上の時は条件組めばいい感じに処理できそうなんだけどわからず。
残りのEasy: -
上2問でやる気が消えたのでPPCは撤退しました。あとでEasy の問題だけは見る…
Pwn
Smash Stack: o
実は新入生唯一の正解者だったらしい。嬉しい。
pwntools をインストールするのに非常に苦労した(というかなんか動かない)。
.py ファイルからじゃたたけないけどコンソールの interactive モードからはpwntoolが使えるって状況だったので、手作業で頑張って打ってなんとか成功。shellが使えたからあとはlsとかを頑張って叩いてフラグゲット。yay
Reversing
Welcome to Reversing: o
Ghidra のインストールが一番たいへんでした。
Link Your Wish: -
見てない
Pyck up!: x
uncompyle6 を使うも出力ファイルがなんと空っぽで終わった。
Shell
Hello Webshell: o
Ctrl-v でパスワードを貼り付けられず泣いてた
netcat: o
はい
Find Image: o
おじいちゃ~ん…。
Veeeeeeery Long Text: o
catして中指を立てながら素早く grep した。
Web
Forbidden 1: o
Cookie 編集する方法知らなかった。フロントエンド全く触ってないのがバレちゃう…
POET ME!: o
普段使ってる Talend API Tester で post すると 400 が出て???となる。問題文の python ファイルを読むと {"password": "pass"}
を投げればいいとわかり投げる。あとはdeleteも送っておわり。
body が空だったから400が出たっぽい、はーん。ちなみに header で「これ json だよ~」って言いながら body で text 入れてリクエスト送ったら500が出た。
Robots: o
ヒントをガン見した。
Forbidden 2: o
For Biden に見えてきた。 自分が昔建てたサーバーもこれやってそうで怖くなってきた。てかどういう仕組みなんだ。
最後に
適当に思った事を列挙しときます。脈絡なくてごめん…。s
- 戦略面だけどEasyの問題全部に目を通せてないのはちょっと勿体なかった気がする。ヒントみないで考えようとした時間がちょっと長かった。あとインストールとか色々に時間がかかった。
- 未経験でこのコンテスト挑むのは死ぬほどハードだと思った。
当日朝に親とCPCTFの話をした時に「CTF と 新入生ってどう紐づくの?」って聞かれてたしかになぁって思ってた。 - でも Newbie のヒントはすごく丁寧だったしEasyのヒントもめっちゃわかりやすくでありがたかった。
- tourist出しをしたけど1位になるには点数が足りず。悲しい人になった。
- PPCのEasyが一つも解けなかったのさすがにショックすぎて泣いてる。
- まぁ、でも1-2-3位はつよつよ競プロerだったっぽいし暖色コーダーの大学一年生(観測範囲内だけで)2人には勝ったんでよしとします。
高校の後輩には負けましたがね(全体のtop5でした)。 - 競技時間6時間にもビビったけど問題数の多さに更にビビった。traP の活動は基本オンラインだからこんなに作ってるのを知らなかったのもある。Visualizer かっこよかったし。
- あと僕は先輩に Easy の意味を伺いたいですね。「ね、簡単でしょう?」ではない
- 賞品の技術書、選べるのかな…?選べるんだったらどうしよう。CTFの本一冊買うのもありだな~
めっちゃやりごたえがあって楽しかったです、CPCTFの準備してた方々ありがとうございましたー!(そしてこれからよろしくお願いします!)