🩻

[write up] TsukuCTF2023 (team:wrightias; 11th place)

2023/12/12に公開

まえがき

12/9-10に行われたTsukuCTF2023にチーム「wrightias」として参加してきました。

結果は「11位」ということで,昨年の結果を下回ってしまいましたが、今年もチームの皆と楽しく競技に取り組めたのではないかなと思います。
10位との差はたったの2点、しかもその10位はあのpinjaさんということで、今年もハイレベルな争いだったと言っても過言ではないでしょう(笑)

write upはリーダである私のアカウントから投稿させていただいておりますが、記事自体は共同編集によりチーム全員で作成しています。そのため、問題によって文体が異なり若干御見苦しい点もあるかと思いますがご容赦ください。

解けた問題のwrite up

解答順となっています。

welcome (tsukushi)

Discordサーバに参加してフラグを取ってくる問題。Discordサーバに参加者を誘導できるとてもいいアイデアだと思います。

TrainWindow (osint, easy)

TrainWindow

夏、騒音、車窓にて。

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

解答への道筋

まず、初島の存在に気づき、撮影地は熱海らへんだろうと推測をたてる。

image

次に、 写真中段右に映っている建物をgoogle lensにかける。すると、この建物がエンゼルシーサイド南熱海なるマンションであることがわかる。googlemapで初島とエンゼルシーサイド南熱海がこの角度で見えそうな方向をあたると、ちょうどよい感じのところに線路が見つかる。線路の座標を取得すると、それが答えとなる。

image

3636 (osint, easy)

3636

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

解答への道筋

「5-3636」、「o.ed.jp」という文字が読み取れるため、とりあえず「"3636" site:ed.jp」で検索する。すると、会津若松市にあるとうみょう子ども園という施設が先述の条件を満たすことがわかる。

タイトルなし

周囲を散歩してみると、全く同じ看板を見つけることができた。この地点の座標が答え。

airport (osint, easy)

airport

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

解答への道筋

後景をgoogle lensにかけると伊丹空港であることがわかる。ゆえに答えは「ITM」。google lensってすごいですね。

big_statue (osint, easy)

statue

大きなドリアンだ!どこにあるんだろう?? フラグの形式は TsukuCTF23{緯度_経度} です。例えば、この像が東京の渋谷駅にある場合、フラグは TsukuCTF23{35.6580_139.7016} となります。

解答への道筋

とりあえず画像検索を試みるも、撃沈する。「榴莲王 利陞」と書いているため、これをもとに検索すると、これがシンガポールにあるドリアン専門店の屋号であることがわかる。

image

ストリートビューでこの店舗を見てみると、写真に映っているものと同じオブジェを発見(同時に、画像検索がうまく機能しなかったのは、これが裏側から撮った写真ゆえであることも判明する)。オブジェらへんの座標を取得し、答えとする。

travel_with_tsukushi (osint, easy)

airport2

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

解答への道筋

写真をgoogle lensにかけると、ここがクアラルンプール国際空港であることがわかる。よって答えは「KUL」。google lensってすごいですね。

mab (osint, easy)

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

解答への道筋

aguse.jpでこのアドレスを調べてみたところ、「https://157-7-107-89.virt.lolipop.jp」にホストされていることがわかった。答えは「lolipop.jp」。
ロリポップとムームードメインが覇権を取っていた往時のインターネットを懐かしんだ。

eruption (osint, easy)

eruption

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

解答への道筋

画像のプロパティを見ると、2022年1月28日の撮影と書いてあり、それがそのまま答えだった。

free_rider (osint, easy)

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

解答への道筋

関連ワードで調べてみると、BBCの記事がヒットする。この記事から、Fidias Panayiotouという方がアップロードした「I Travelled Across Japan For Free」という動画であることがわかる。元動画はすでに削除されているが、youtubeにはいくつか再アップロード動画がある。そのうちのひとつを参考に、FNNの記事のキャプチャ画面が2:56のものであることをメモする。

次に、元動画のURLを探す。調べたところ、IMDbに、動画のIDが「Dg_TKW3sS1U」である旨が記載されていた。2つの情報を組み合わせると、「https://www.youtube.com/watch?v=Dg_TKW3sS1U&t=176s 」が答えであることがわかる。

castle (osint, easy)

castle

この前、お城に行ってこの写真を取ってきたんだ!
どこにあるかわかるかい?

フラグのフォーマットは、TsukuCTF23{緯度_軽度} です。 小数点は第三桁まで有効とします。

解答への道筋

google lensで検索すると、これが太陽公園の「城のエリア」であることがわかる。小数点以下3桁と、求められる精度がゆるめであったため、真ん中あたりの座標を取得する。これが答えとなった。

location_for_what (osint, easy)

location_for_what (1)

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

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

解答への道筋

まあ言の葉の庭とかじゃないかな…と思って入力したところ、そのままcorrectした。ほかのwriteupを見ても勘で正答に至っている人が多く、まあそうですよねという気持ちになった。

green_bridge (osint, easy)

green_bridge

この写真が撮影されたのはどこですか...?
Flagフォーマットは TsukuCTF23{緯度_経度} です。
端数は少数第4位を四捨五入して小数点以下第3位の精度で回答してください。

解答への道筋

google lensで検索したところ奥に見えている橋は那須塩原市の「もみじ谷大橋」で、写真はその道中であることがわかる。

GA0HbfDbcAAaz8F
道路の白線を頼りにgoogle mapでそれらしいところにあたりをつけ、ストリートビューで確認する。

broken display (osint, easy)

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

解答への道筋

奥に日能研の看板が見える。また、ロクシタンのロゴが反射している。これらの情報から、撮影地が国内のまあまあ大きめの商業施設であることが予想される。日本のショッピングセンター一覧 - Wikipediaを流し見すると、「阪急西宮ガーデンズ」という施設があることがわかる。

ロゴを確認すると、「正しく表示されているときに書かれている施設名」が「NISHINOMIYA GARDENS」であることがわかる。これが答え。

title_screen (rev, medium)

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

解答への道筋

与えられたファイルは以下のような構成になっている。

image

  • main.asm アセンブリ言語のファイル
  • main.cfg 何らかのビルド設定ファイルのようなファイル
  • character.bmp 文字などが書かれた画像ファイル(上記画像はこれをトリミングしたもの)

アセンブリ言語を調べているとPPUなる文字があったので、画像の雰囲気と合わせて、ファミコンのコードではないかと予想。コード内の特徴的な単語で検索すると実際あっているようだった。以前、ファミコンのアセンブリを書いてみようといろいろ調べてみたことがあったのでこのような神通力が使えた。

問題文的にはおそらく、コードを解析して、タイトルに出る文字を「予想」することが想定されているのだろう。ただ、main.cfgも与えられているし、めんどくさいので、エミュレータで動かせそうという方針で解くことにした。

実はこの問題、入手可能なアセンブラでROMデータを作成し、エミュレータで簡単に実行できてしまうのだ。この点から問題文は嘘であることがわかる。父は昔プログラマーなのでなく、現在進行形のコンピュータのおたくである。息子(娘)を試しているのだ。

アセンブラとエミュレータは以下のものを使う。

以下のコマンドでROMファイル(*.nes)ファイルを作成できる。

/path/to/cl65 -t nes -C main.cfg main.asm -o main.nes

作成したmain.nesをFCEUXで実行すればよい。

しかし、流石にこの問題はそこまで簡単ではない。この問題ではmain.asmの最後の行でcharacter.chrを参照しており、このファイルは与えられていないからだ。一方で、character.bmpは与えられている。神通力でこのファイルをchr形式に変換すればいいと考えた。

いろいろ試行錯誤しているとbmp2chrというその通りのツールを発見した。このツールは128*128の8bit Bitmapをchrに変換してくれる。与えられた画像をトリムし、8bit bitmapに変換すると、character.chrを生成できた。

image

こちらがフラグとなる。

what_os (misc, easy)

とある研究所から、昔にシェル操作を行った紙が送られてきた来たんだが、 なんのOSでシェルを操作しているか気になってな。 バージョンの情報などは必要ないから、OSの名前だけを教えてくれないか?
にしても、データとかではなく紙で送られて来たんだ。一体何年前のOSなんだ。。。
送られてきた紙をダウンロードして確認してほしい。

解答への道筋

「紙」ことテキストファイルにはコマンドの履歴が書かれている。

この問題は3秒で解ける問題である。

  1. どうみてもUNIX LIKEなOSであろう
  2. calコマンド結果が1971年を指している

答えを書くまでもない。去年のPDP-11問題を思い出した。

perfume (osint, easy)

とある施設でいろいろな香水を見かけたが、施設の場所が思い出せない。
この施設の場所を調べ、教えてほしい。

フラグはTsukuCTF23{緯度_経度}であり、小数点第三桁まで有効である。

解答への道筋

google lensにかけると、別府市にある「大分香りの博物館」が撮影地であることがわかる。この座標を取得すると答えになる。

tsukushi_estate (osint, easy)

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

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

解答への道筋

写真から、これが松阪市にある「つくし不動産」の管理物件であることがわかる。この会社が所有している物件を公式サイトからさらっていくと、伊勢SIビルが撮影地らしいことがわかる。不動産業者のサイトいわく、築年月は1983年3月であり、それが答え。

image

content_sign (misc, medium)

どうやら、この画像には署名技術を使っているらしい。この署名技術は、画像に対しての編集を記録することができるらしい。署名技術を特定し、改変前の画像を復元してほしい。 Flag形式はTsukuCTF23{<一個前に署名した人の名前>&<署名した時刻(ISO8601拡張形式)>}です。例えば、一個前に署名した人の名前は「Tsuku」で、署名した時刻が2023/12/09 12:34:56(GMT+0)の場合、フラグはTsukuCTF23{Tsuku&2023-12-09T12:34:45+00:00}です。なお、タイムゾーンはGMT+0を使用してください。

(画像が与えられるがOSINT問ではないので割愛)

解答への道筋

このようなフォレンジック問題では最初にFotoForensicsをかけるのが定石だと(個人的に)思っている。

メタデータを調査すると、「C2PA」という技術が使われていることがわかる。C2PAは生成AIなどによって起こりうる問題を解決する(生成AIによって作成された画像に透かしを入れる)ということで注目されている署名技術である(参考)。

そこで、「c2patool」というツールで署名データの詳細を調査する。このツールを使うとおのずとフラグがわかる。

自分はAI×セキュリティには以前より関心があり、C2PAのような技術をテーマにした出題が行われて少しうれしかった。こういった話に興味がある若い方は、セキュリティキャンプのAIセキュリティコースにぜひ応募してみてほしい。面白いよ。

kiZOU (osint, medium)

image

(サイズが大きかったため圧縮しています)

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

解答への道筋

写真から、撮影地が那覇市の「au style naha」近辺であることがわかる。ストリートビューをみると、「端っこしか写ってない」像がシーサーであることがわかる。

google mapいわく、このauは「パレットくもじ」というモールの一店舗であるようなので、「パレットくもじ シーサー 寄贈」と検索してみる。すると、このようなツイートがヒットする。上原清善さんという地域の名望家が、那覇市政70周年を記念して寄贈したものであるらしい。よって答えは「上原清善」。

image

RegexCrossword (osint, medium)

RegexCrossword

クロスワードを解いてみて!
これを作った会社の本社の郵便番号をハイフンありで答えてね!!

解答への道筋

正規表現パズル。もちろんこれはOSINT問であり、クロスワードを解くことは求められていない(はずである)。「正規表現 クロスワード」で検索すると、ねとらぼの記事がヒットする。会津大学の学食のナプキンらしい。次に、「会津大学 正規表現 クロスワード」で検索すると、解答を記した個人ブログが見つかる。

image

クロスワードを解くと、このナプキンを作ったのが「Eyes, Japan」という会津若松市内の企業であることがわかる。会社概要より、本社オフィスの郵便番号は「965-0872」。これが答えとなる。

CtrlAltPrtSc (osint, easy)

CtrlAltPrtSc (2)

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

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

解答への道筋

目を凝らすと、上の方に数ピクセルほどyoutubeの画面が見える。よって答えは「youtube」。RISに依存し、画像そのものを虚心坦懐に調べないOSINT者を戒めるための問題。

※RIS = Reverse Image Search

tsukushi_no_kuni (osint, easy)

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

解答への道筋

高校日本史を懐かしみながら、wikipediaの「磐井 (古代豪族)」の記事を読む。その子孫に「筑紫薩夜麻」という人物がいるらしく、これが答えだった。問題の詳細についてはwikipedia「九州王朝説」を参照のこと。なんなんですかこの問題?

Yuki (osint, easy)

Yuki

雪、無音、窓辺にて。

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

解答への道筋

窓から見える橋を切り取り、google lensにかけると、これが札幌市の定山渓大橋、撮影場所が定山渓ビューホテルであることがわかる。google mapの航空写真をみながら、ちょうどよさそうな座標を探すと答えが得られる。

image

basic (web, easy)

保護されていない通信ではパスワードはまる見えダゾ!
e.g. パスワードが Passw0rd! の場合、フラグは TsukuCTF23{Passw0rd!} となります。"

(basic.pcapngが与えられる)

解答への道筋

みんな大好きWiresharkでpcapngファイルを開く。問題文からTLSで暗号化されていない場合にWebサービスを利用したのだろうと推測。HTTPのデータを探し、Authorizationヘッダを探すと見つかった。

river (osint, easy)

image (1)

弟のたくしから、「ボールが川で流されちゃった」と写真と共に、連絡がきた。
この場所はどこだ?
Flagフォーマットは TsukuCTF23{緯度_経度} です。
端数は少数第5位を切り捨てて小数点以下第4位の精度で回答してください。

解答への道筋

image
「newgin 専用駐車場」という文字が見える。パチンコの筐体メーカーらしい。都市規模を勘案しつつ、会社概要に掲載される事業所一覧を調べていくと、ニューギン販売の鹿児島事業所であることがわかる。google mapを見ながら、それらしい地点の座標を取得すると、それが答えとなる。

image

grass_court (osint, hard)

tennis (1)

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

解答への道筋

antena
木の影でかなりわかりづらいが、巨大なアンテナらしきものがある(電子望遠鏡)。Wikipediaの「日本の電波望遠鏡一覧」を参照する(問題文より日本国内に限定される)。この一覧には口径が記載されているので画像からなんとなく当たりをつけた大きさの望遠鏡がある観測所の航空写真をgoogle mapで確認する。テニスコートと望遠鏡の位置関係から、国立天文台水沢観測所であることがわかる。

antenamap

laser (osint, easy)

laser

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

解答への道筋

これもチームメイトに阪神百貨店であることを教えてもらう。検索すると、記事が確認できるのでそれらしきポイントの座標を提出。

fiction (osint, easy)

fiction

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

解答への道筋

チームメイトからVALORANTというゲームの「Sunset」であることを教えてもらう。実際の土地の緯度経度が示されている。これをフラグフォーマットに沿うように加工して提出。

stickers (osint, easy)

stickers

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

解答への道筋

prin
ステッカーから場所の同定は困難と判断。奥の車(熱海プリン)と建築物(FUJITEC)に注目する。車は熱海プリンのもので、熱海プリンは熱海市内に数店舗ある。各店舗の航空写真を確認するが画像に一致する場所は見当たらない。そこで熱海市内のFUJITECの事務所を検索するが、住所は公開されていなかった(FUJITECのサイトから熱海にサービスセンターがあることが確認できるが、住所は公開されていない)。熱海プリンの車に焦点を当て検索すると、どうやらキッチンカーの用途で使用されているようでないことがわかる(各店舗間の輸送に使用されていると推測)。よって画像は熱海プリンの店舗のいずれか付近であることがわかるので、航空写真やストリートビューをもう一度確認するとFUJITECのサービスセンターが入居するマンションの外壁に似る建物を発見。画像にある祠?も発見できた。この祠?は熱海七湯 河原湯であった。

udon_2023 (osint, hard)

udon_2023

ここのうどん、麺だけじゃなく、鶏天も美味しい!!!
お店の場所を忘れたから、7文字のplus codeで教えて!!!

解答への道筋

画像をgoogle、Bing、Yandexで画像検索にかける。するとbingにて同じ器が使われたうどんの画像が確認できる。この画像は「肉讃岐 甚三うどん 神田店」の食べログに投稿されたものであることがわかる。このうどんチェーンは都内に5店舗を有する。卓上の調味料などからこのチェーンであると推測し、すべての店舗を確認するとその1つが答えとなる(どの店舗か忘れた)。

(余談)海外から参戦したので日本のうどんが非常に恋しくなった。早く帰国したい泣

twin (osint, medium)

ハッカーは独自に収集した大量の個人情報を、とあるWebサイト上で2023年11月23日に投稿した。
我々はこの投稿IDがKL34A01mであるという情報を得た。ハッカーのGitHubアカウントを特定せよ。

解答への道筋

チームメンバーが「情報流出データが掲載されている」という問題文より『pastebin (https://pastebin.com/) 』ではないかと推測したため、pastebinにて投稿ID「KL34A01m」をpastebin.com/以下に直打ちする。すると
同IDの文章(個人情報のファイル)が存在することがわかる(https://pastebin.com/u/gemini6152 )。この投稿したユーザ名「Gemini6152」をgithub上で検索しても答えには辿りつけない。そこで、このユーザの別の投稿(TsukuCTFのロゴAA)のファイル名「Tsuine」をgithub上で検索すると、同じロゴAAを投稿するアカウント「gemini5612」があるのでそれを提出。

(リーダーから補足)解いてもらったチームメンバーはプログラミングにあまり詳しくないので「AA」という語を使っているが、最終的に入手できるRubyスクリプトはQuine(コード自身を出力するコード)となっている。TsukushiのQuineなのでTwin?Tsuine?

koi (osint, medium)

koi

(サイズが大きい画像だったため圧縮しています)

画像フォルダを漁っていると、鯉のあらいを初めて食べた時の画像が出てきた。当時のお店を再度訪ね、鯉の洗いを食べたいが電話番号が思い出せない。
誰か、私の代わりにお店を調べ、電話番号を教えてほしい。
記憶では、お店に行く途中で見かけたお皿が使われていた気がする。。。
Flagは電話番号となっており、ハイフンは不要である。

解答への道筋

チームメンバーが、

  • この焼き物は「小鹿田焼」だろう(神通力)
  • 小鹿田がある日田市やその周辺地域(九州小京都)では鯉のあらいが名物

までわかったに解けない!!ということで助けに入る。

問題文の「初めて食べた」を活用していないことに気づき、X(旧: Twitter)やInstagramで「鯉のあらい 初めて」などで検索。すると同じお皿に同じ料理の写真が見つかる(一般人の投稿なので掲載しません)。

その写真には店名入りの割りばしの袋が写っていたので、そのお店の電話番号をいれてcorrect!

なお、特徴的な陶器の模様は「飛び鉋」というそうだ。

build_error (misc, medium)

main.o, one.o, Makefileが与えられ、ビルドして実行後の標準出力から答え(整数)を得よという問題。問題文は割愛した。

解答への道筋
$ make
cc main.o one.o -no-pie
/usr/bin/ld: main.o: in function `main':
main.c:(.text+0x8b): undefined reference to `a'
/usr/bin/ld: main.c:(.text+0x92): undefined reference to `b'
collect2: error: ld returned 1 exit status
make: *** [Makefile:4: all] エラー 1

エラーを調べてみると、main.oのシンボル(関数)が未定義であるそうだ。シンボルはnmコマンドで確認できる。

$ nm main.o
                 U a
                 U b
                 U c
0000000000000000 T main
                 U one_init
                 U printf
                 U puts

大文字のUは未定義であることを示す。ところで、エラーはaとbについてのみでcについては出ていない。gccでは後続のオブジェクトファイルにシンボルが定義されていれば、それを利用する仕組みがある。つまり、

$ nm one.o
0000000000000008 b a
0000000000000010 b b
0000000000000000 B c
0000000000000000 T one_init

ここで、大文字Bはパブリックシンボル、小文字bはローカルシンボルを表している。パブリックであるcはgccがリンクしてくれるが、a,bはローカルなのでリンクできないということになる。

色々調べた結果、

$ objcopy --globalize-symbol a one.o global.o
$ objcopy --globalize-symbol b global.o global.o
$ nm global.o
0000000000000008 B a
0000000000000010 B b
0000000000000000 B c
0000000000000000 T one_init

とするとシンボルのスコープを変更できることが分かった。つまり、

gcc main.o global.o -o main
$ ./main
flag is 120

が答えである。

無知だったがStack Overflowを検索しまくって答えまでたどり着けた。
objdumpで逆アセンブルして手計算する方法でも解けそうだけど、やった人いるのだろうか・・・?

MEMOwow (web, medium)

素晴らしいメモアプリを作ったよ。
覚える情報量が増えているって???
http://133.130.XXX.XXX:31415 (IPは隠しました)

解答への道筋

自分より詳しい他の方がたくさん解説を書いていると思うので勉強になったなぁと思うことや要点をまとめる。

  1. ファイルパスの/は何個でも書ける
# どちらも同じ結果になる
f = open("./memo/flag", "rb")
f = open("./memo/////flag", "rb")
  1. Pythonのbase64.decode()はデフォルトでデコードできない文字を無視する
import base64
flag = "f-l-a-g".encode()
x = base64.b64decode(flag)
s = base64.b64encode(x).decode()
>>> s
'flag'

validate=Trueとすると、無視せず例外を投げてくれるそうだ。また、decodeは文字数が4の倍数でないと失敗する。

  1. Postリクエストは直接送信できる
Postmanというソフトを用いて、POSTリクエストをrawモードで送信する。
フォームの値の場合は、
name=value
のようにbodyを構成すればよい。
今回の問題ではreadもwriteも
content=payload
これによりフロントエンドが悪さをするのを完全無視できる。

これらを踏まえて配布されているコードを熟読すると、

  1. サイトトップに接続してセッションを初期化する
  2. /writeにcontent=%ff%ff%ff%ff%ff%ff~V%a0を送る
  3. /readにcontent=////////f--------------------------------lagを送る

とすると、レスポンスでflagを入手できた。もっと短くできそうではある。

おわりに

今年も楽しく遊ばせていただきました!

運営の皆さまをはじめ、すべての関係者の皆様に感謝の意を表しまして、write upの結びとさせていただきます。

更新履歴

  • 12/12 0:40 初版公開
  • 12/13 18:40 twinのwrite upを追加

Discussion