All Articles

TsukuCTF 2023 Writeup

12/9 から開催されていた Tsuku CTF 2023 に 0nePadding で参加し 13 位でした。

image-20231213180401832

僕は OSINT しか解きませんでしたが、いくつか面白かった問題の Writeup を書きます。

もくじ

title_screen(Rev)

父は昔プログラマーだったらしい、 しかし、当時開発したソフトのタイトルが思い出せない。 ソフトを起動すると画面にタイトルが表示されるらしいのだが… 残っている開発データからなんとか導き出そう!※実行結果として予想される表示文字列(記号含む)をフラグとして解答してください。

Rev は静的解析頑張ろうと仕様を調べてる間にチームメンバーがサクッと解いてくれたので復習として書いていきます。

参考:TsukuCTF 2023 Writeup

問題バイナリとして与えられたアセンブリと bitmap ファイルは、どうやら NES というファミコンゲームのプログラムっぽいということがわかります。

ゲームのタイトルに表示される文字を予測することで Flag が取得できます。

しかし、どうやら静的解析ではなくアセンブリをビルドしてエミュレータで実行する方法でも Flag を取得できたようなので、この方法を試していきます。

まずは、以下の Wiki の手順で cc65 コンパイラをビルドします。

参考:Installing CC65 - NESdev Wiki

sudo apt install build-essential git
mkdir -p ~/develop
cd ~/develop
git clone https://github.com/cc65/cc65.git
cd cc65
nice make -j2
make install PREFIX=~/.local

次に、bmp2chr を使用して bitmap を chr に変更します。

bmp2chr を使用するためには事前に bitmap ファイルを 128*128 のサイズに変更しておく必要があります。

参考:suzukiplan/bmp2chr: Make NES pattern table from 8bit bitmap (CLI)

最後に、ビルドしたディレクトリ内の cl65 を使用して以下のコマンドを実行します。

cl65 -C main.cfg main.asm -o game.nes -L ~/develop/cc65/lib

-L オプションは、ld65: Error: Input file 'c64.lib' not found のエラーを回避するために必要でした。

ここでビルドしたバイナリを FCEUX というエミュレータで実行すると、正しい Flag を得ることができました。

参考:FCEUX

image-20231213214453975

airport(OSINT)

つくしくんは、旅の思い出を振り返っていましたが、この写真はどこの空港かわからなくなりました。 ここはどこの空港か教えてくれませんか? Flagフォーマットは TsukuCTF23{空港の3レターコード(IATA)} です。

問題バイナリとして与えられたのは以下の画像でした。

image-20231209142001218

Google Lens で調べると、伊丹空港の画像であることがわかります。

image-20231209142020530

というわけで Flag は TsukuCTF23{ITM} になりました。

eruption(OSINT)

つくしくんは旅行に行ったときに噴火を見ました。噴火の瞬間を実際に見たのは初めてでしたが、見た日付を覚えていません。 つくしくんが噴火を見た日付を写真の撮影日から特定して教えてください。 撮影場所が日本なのでタイムゾーンはJSTです。フラグの形式は TsukuCTF23{YYYY/MM/DD} です。

問題バイナリとして与えられたのは以下の画像でした。

image-20231209142116922

こちらも Google Lens で知らべたところ、ほぼ一致する画像が見つかりました。

image-20231209142140677

ただ、結局この画像は関係なく、最終的には exif の日付から Flag が TsukuCTF23{2022/01/28} であることを特定しました。

$ exiftool eruption.jpg
ExifTool Version Number         : 12.40
File Name                       : eruption.jpg
Directory                       : .
File Size                       : 119 KiB
File Modification Date/Time     : 2023:12:08 10:14:17+00:00
File Access Date/Time           : 2023:12:08 10:14:17+00:00
File Inode Change Date/Time     : 2023:12:08 10:14:17+00:00
File Permissions                : -rw-r--r--
File Type                       : JPEG
File Type Extension             : jpg
MIME Type                       : image/jpeg
Exif Byte Order                 : Big-endian (Motorola, MM)
Make                            : Apple
Camera Model Name               : iPhone SE (2nd generation)
X Resolution                    : 72
Y Resolution                    : 72
Resolution Unit                 : inches
Modify Date                     : 2022:01:28 14:19:00
Y Cb Cr Positioning             : Centered
Exif Version                    : 0232
Date/Time Original              : 2022:01:28 14:19:00
Create Date                     : 2022:01:28 14:19:00
Components Configuration        : Y, Cb, Cr, -
Flashpix Version                : 0100
Color Space                     : Uncalibrated
Lens Make                       : Apple
Lens Model                      : iPhone SE (2nd generation)
Image Width                     : 1125
Image Height                    : 626
Encoding Process                : Baseline DCT, Huffman coding
Bits Per Sample                 : 8
Color Components                : 3
Y Cb Cr Sub Sampling            : YCbCr4:2:0 (2 2)
Image Size                      : 1125x626
Megapixels                      : 0.704

locationforwhat(OSINT)

とある場所を友達と探索していると、「ここ、何かの映画の聖地だった気がするけど、名前忘れちゃった…」とのこと。 シュッと特定して教えてあげよう!

Flagの形式は TsukuCTF23{映画のタイトル} です。

問題バイナリとして与えられたのは以下の画像でした。

image-20231209142512604

この画像を見たところ新宿御苑かなーという感じでしたので、サクッと Google Lens で特定しました。

image-20231209142544636

あとは、新宿御苑が聖地になっているアニメを Google 検索で探した結果 TsukuCTF23{言の葉の庭} が Flag であることを特定できました。

3636(OSINT)

ここはどこ…? Flagフォーマットは TsukuCTF23{緯度_経度} です。 端数は少数第四位を四捨五入して小数点以下第三位の精度で回答してください。

地味に難しい問題でした。

問題バイナリとして以下の画像が与えられ、電話番号の末尾が 5-3636 であり、恐らく HP のアドレスの末尾が o.ed.jp であることがわかります。

image-20231209142707943

とりあえず、Google でドメインを絞って電話番号を検索したところ、とうみょう子ども園という施設が条件に合致することがわかりました。

image-20231213215519890

しかし、Google Map でとうみょう子ども園の周辺を調べてもそれらしい看板が見つからず、しばらく放置していました。

最終的に、チームメンバーが施設近くの交差点にこの看板があるのを発見してくれたことで、TsukuCTF23{37.502_139.929} が Flag であることを特定できました。

画像

mab(OSINT)

mab.main.jpが使用しているレンタルサーバサービスを特定し、そのWebサイトのドメイン名を答えてください。Flagフォーマットは TsukuCTF23{ドメイン名}です。

まずはこのドメインの名前解決される IP アドレスを調べます。

dig mab.main.jp

; <<>> DiG 9.18.18-0ubuntu0.22.04.1-Ubuntu <<>> mab.main.jp
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 63257
;; flags: qr rd ad; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 0
;; WARNING: recursion requested but not available

;; QUESTION SECTION:
;mab.main.jp.                   IN      A

;; ANSWER SECTION:
mab.main.jp.            0       IN      A       157.7.107.89

;; Query time: 20 msec
;; SERVER: 192.168.32.1#53(192.168.32.1) (UDP)
;; WHEN: Wed Dec 13 13:06:59 UTC 2023
;; MSG SIZE  rcvd: 56

手元の環境の dig コマンドだと A レコードしか表示されませんでしたが、nslookup コマンドを叩くとこの IP が lolipop.jp と紐づいていることがわかります。

nslookup 157.7.107.89
89.107.7.157.in-addr.arpa       name = 157-7-107-89.virt.lolipop.jp.

Authoritative answers can be found from:

というわけで、TsukuCTF23{lolipop.jp} が Flag になりました。

tsukushi_estate(OSINT)

つくし君が写真に写っているビルにオフィスを構えたいらしいのだけど、築年数が少し心配… つくし君の代わりに調査してください!

Flagの形式は TsukuCTF23{築年月} です。 例えば、2022年3月に出来たビルであれば、 TsukuCTF23{202203} になります。

問題バイナリとして以下の画像が与えられます。

image-20231213221409746

このつくし不動産の管理物件を調べたところかなり少なかったのですべての建物の画像と比較しました。

すぐに以下の物件が見つかったので、Flag が TsukuCTF23{1983_03} であることを特定できました。

image-20231213221623312

travelwithtsukushi(OSINT)

旅が好きなつくしくんは、空港の写真からそれがどこの空港かすぐにわかります。 つくしくんからの挑戦状! これがどこの空港かわかるかな? Flagフォーマットは TsukuCTF23{空港の3レターコード(IATA)} です。

問題バイナリとして以下の画像が与えられました。

image-20231213221714443

とりあえず飛行機で画像検索をかけた結果クアラルンプール国際空港があっさり見つかり、TsukuCTF23{KUL} が正解 Flag になることを特定できました。

kiZOU(OSINT)

ここは日本で一番のリゾート地!少し歩くと目の前に素敵な像が見えたから写真を撮ったつもりだったんだけど、見返したら端っこしか写ってない!困ったなぁ、この像についてもっと知りたかったんだけどなぁ。僕の代わりにこの像について調べてくれないか? フラグ形式は TsukuCTF23{像を寄贈した人物の名前} です。

問題バイナリとして以下の画像が与えられました。

image-20231213221853175

au ショップを探すと、パレット久茂地前であることがわかります。

画像

ここで、Google Map の画像から「パレット久茂地 シーサー」などで調べたところ、以下のようなポストが見つかり、TsukuCTF23{上原清善} が Flag になることを特定できました。

image-20231213222053530

TrainWindow(OSINT)

夏、騒音、車窓にて。

フラグのフォーマットは、TsukuCTF23{緯度_経度}です。 緯度経度は小数第五位を切り捨てとします。

問題バイナリとして以下の画像が与えられます。

image-20231213222253769

なんとなく風景から伊豆のあたりかなぁと推測を建てつつ、中央に見える TTC という建物を検索してみます。

image-20231213222327402

すると、以下の通り 1 箇所ピンポイントでマッチする場所が見つかりました。

image-20231213222401429

あとは右手前に見える廃墟のような建物の位置と角度を合わせることで、正しい Flag が TsukuCTF23{35.064084_139.0664} となることを特定できました。

CtrlAltPrtSc(OSINT)

仕事中にCtrl + Alt + PrtScでウィンドウのスクリーンショットを撮ったよ。

つくし君がサボって使用していたサービスの名前を答えよ。 フラグはTsukuCTF23{サービスの名前}の形式です。

問題バイナリとして以下の画像が与えられますが、こちらは見た瞬間に Youtube の画面であることがわかるので、Flag を簡単に特定することができました。

image-20231213222653825

しかし、実はこの問題、元々は何の動画を見ているか当てる問題だったようです。

参考:tsukuctf2023satokiwriteups/osint/CtrlAltPrtSc at main · satoki/tsukuctf2023satokiwriteups

というわけでレッツチャレンジ。

まずは四辺の 1px を別の画像として抜き出します。

from PIL import Image

def crop_borders(input_path):
    original_image = Image.open(input_path)
    width, height = original_image.size
    top_border = original_image.crop((1, 0, width - 1, 1))
    top_border.save(f"top_border.png")

    bottom_border = original_image.crop((1, height - 1, width - 1, height))
    bottom_border.save(f"bottom_border.png")

    left_border = original_image.crop((0, 1, 1, height - 1))
    left_border.save(f"left_border.png")

    right_border = original_image.crop((width - 1, 1, width, height - 1))
    right_border.save(f"right_border.png")

if __name__ == "__main__":
    input_path = "CtrlAltPrtSc.png"
    crop_borders(input_path)

一番ヒントになりそうなのは左下隅の以下のカラーパターンでしょうか。(まったくわからん)

image-20231213224527455

ダメもとで四辺の画像を検索してみましたがさすがに何も見つかりませんでした。

しばらく考えたものの全くわからずでしたので、またわかったら追記しようと思います。

laser(OSINT)

光源の座標を正確に教えてください。 フラグフォーマットは、TsukuCTF23{緯度_経度}です。 小数点以下5位を切り捨てて、小数点以下4桁で答えてください。

問題バイナリとして以下の画像が与えられます。

image-20231213224910426

「緑色 レーザー 謎」などで検索すると、大阪のイベントに関連するものであることがわかります。

image-20231213225002584

画像

あとは、ニュース記事から特定した梅田吸気塔の上記の場所の座標を特定し、TsukuCTF23{34.7016_135.4991} が正解の Flag になることを特定しました。

Yuki(OSINT)

雪、無音、窓辺にて。

フラグのフォーマットは、TsukuCTF23{緯度_経度}です。 緯度経度は小数第四位を切り捨てとします(精度に注意)。

問題バイナリとして以下の画像が与えられます。

image-20231213225316977

こういうのは大体特徴的な建物を切り出して画像検索すればよいので、中央の赤い屋根の家をさがしてみることにしました。

すると、以下のブログの画像が見つかり、この場所が北海道であることがわかりました。

image-20231213225416726

参考:Manmade, Naturally: A Month in Hokkaido, Japan — Ben Richards

あとは、Google Map でここがカフェ サンリバーであることを特定し、正しい Flag が TsukuCTF23{42.968_141.166} であることを特定しました。

image-20231213225506548

tsukushinokuni(OSINT)

かつて、筑紫国を統治していた国造の一人が乱を起こした。 その子孫の一人が、ある天皇と同一人物である説が提唱されている。 その子孫の名前を TsukuCTF23{} で囲んで答えよ。

「筑紫 天皇」などで調べると、すぐに以下の記述が見つかりました。

これらのことは「壬申の乱」の主役は「薩夜麻」であり、「天武」(大海人)とは「薩夜麻」のことである、ということを「強く」示唆するものと考えられ、『書紀』はそれを「隠蔽」していると考えられるものです。

参考:「天武」と「薩夜麻」 - 古田史学とMe

しかし、「薩夜麻」などでは Flag が通らずしばらく悩みましたが、最終的に TsukuCTF23{天武} で正解となりました。

これは果たして「子孫の名前」といってよいのだろうか?

free_rider(OSINT)

https://www.fnn.jp/articles/-/608001 私はこのユーチューバーが本当に許せません! この動画を見たいので、元のYouTubeのURLを教えてください。 また、一番上の画像(「非難が殺到」を含む)の再生位置で指定してください。 フラグフォーマットは、TsukuCTF23{https://www.youtube.com/watch?v=**REDACTED**&t=**REDACTED**s}

中々胸糞悪い Youtuber の削除された動画を特定する問題でした。

適当に SNS を調べて URL を特定した後、Wayback Machine で調べて Flag を取得しました。

参考:I Travelled Across Japan For Free - YouTube

broken display(OSINT)

表示が壊れているサイネージって、写真を撮りたくなりますよね! 正しく表示されているときに書かれている施設名を見つけて提出してください! フラグ形式: TsukuCTF23{◯◯◯◯◯◯◯◯IYA_◯◯◯◯◯◯S}

問題バイナリとして与えられた以下の画像をよく見ると、サイネージの反対側にロクシタンの店舗があることがわかります。

image-20231213225955635

また、奥の建物の見え方からして、2 階以上の建物であると予想できます。

ロクシタンの HP を見ると、全国に店舗が 100 そこそこしか無いようでしたので、2 階以上かつ建物名の末尾が「IYA」となる場所を探しました。

image-20231213230109736

意外なことにロクシタンの店舗のほとんどは 1 階に展開されていることもあり、阪急西宮ガーデンズが該当する店舗であることがわかりました。

ただ、阪急西宮ガーデンズの中の画像を探してもこのサイネージらしきものが見つからず、少々確認に難航しました。

最終的に、奥に見える駅や日能研の位置とロクシタンの店舗の位置から角度を調整した結果、ストリートビューでサイネージの裏側を特定することができました。

画像

これで、正しい Flag が TsukuCTF23{NISHINOMIYA_GARDENS} であることを特定できました。

stickers(OSINT)

この画像が撮影された場所を教えてください! Flagフォーマットは TsukuCTF23{緯度_経度} です。 ただし、小数点4桁の精度で答えてください。

ちょっと難し目でした。

問題バイナリとして与えられた以下の画像をよく見ると、裏に木製の電柱が立っていることがわかります。

image-20231213230637366

木製の電柱が残存している場所は温泉街が多いイメージなのと、背景の車両が熱海プリンのものである点から、この場所が熱海温泉にあるのではという推測が立ちます。

そこで、「熱海温泉 観光スポット」などで検索していったところ、以下の画像を見つけることができました。

image-20231213230916440

これで、Flag が TsukuCTF23{35.0967_139.0747} であることを特定しました。

flower_bed(OSINT)

花壇の先にQRコードのキューブがあるようですね。友人曰く、モニュメントの近くに配置されているものらしいです。 こちらのQRコードが示すURLを教えてください! リダイレクト前のURLでお願いします!

Flagの形式は TsukuCTF23{URL} です。例えば、https://sechack365.nict.go.jp がURLなら、 TsukuCTF23{https://sechack365.nict.go.jp} が答えになります。

問題バイナリとして与えられた以下の画像の QR コード周辺の文字を読むと、旧福 という文字が見えます。

また、Civil Hall and ... Official Site という文もあり、福島か福岡か福井の公共施設の当たりかなという予想が立ちます。

image-20231213231021225

そこで、各県に対して 福岡 "旧福岡" 花 公園 のような検索ワードを使用してみたところ、「旧福岡県公会堂貴賓館」という場所が当たりっぽいことがわかります。

image-20231213231256386

Google Map でこの公園を調べると、ピンポイントで画像と一致する場所を見つけることができました。

image-20231213231342527

これで、正しい Flag が TsukuCTF23{http://www.fukuokaken-kihinkan.jp} であることを特定できました。

grass_court(OSINT)

しばらく使われていないテニスコートのようだ。 この日本にあるテニスコートの場所はどこだろう。 フラグの形式は TsukuCTF23{緯度_経度}です。 小数点以下5位を切り捨てて、小数点以下4桁で答えてください。

問d内バイナリとして与えられた画像を見ると、奥にパラボラアンテナっぽいものが見えます。

また、周辺の植物を見る感じ北国っぽい印象を持ちました。

image-20231213231515005

そこで、「パラボラアンテナ テニスコート 横」という検索ワードで適当に検索してみたところ、一発でそれっぽい画像が出てきました。

image-20231213231707935

この画像の場所である水沢VERA観測所(旧緯度観測所) を Google Map で調べたところ、位置関係が完全に一致するテニスコートとパラボラアンテナが存在していることがわかりました。

image-20231213231837266

これで、正しい Flag が TsukuCTF23{39.1349_141.1323} であることを特定できました。

hunter(OSINT)

名前をメールで聞こうとしたところ、相手のGmailの一部が分からなくなってしまいました。 大変お忙しいところ恐縮ですが、暇なときに調査してください。 qeinijo#iby#@gmail.com

が不明な部分です。

なお、外部サービスに短期間で多くのアクセスをしないようにしてください。

Ghunt というツールを使ってブルートフォースを回すと Flag が取れたらしいです。

ブルートフォース NG かと思って避けてたんですが、Ghunt なら OK みたいな感じなのかな・・・?

参考:TsukuCTF 2023 WriteUp #Security - Qiita

まとめ

今回はしばらく CTF に出てなかったメンバーも参加してくれて、ほぼ全メンバーでチャレンジできた CTF でしたのでとても楽しめました。

問題数も多く、どれも面白かったです。

運営ありがとうございました。