週報

週報 2025.12.08 - 2025.12.14

2025-12-14

12/8

8:30 あたりに起床。 今日は、ゴミケのシフトがあった。

ある程度パソコンをしばき回した後、ICPC の旅費申請のために情報科学類事務に行き書類等をしばいた。

昨日 ICPC のコーチ用の賞状 (?) を渡しそびれていたので、コーチのもとを訪ねたが、カバンに入れていたと思っていたものが見つからず、結局渡せなかった。 「ごめん、後日渡します」みたいな会話をして、ゴミケに戻った。

ある程度のところで切り上げて 5 限のオペレーティングシステムの授業に出た。 来週テストらしく、本当にやばい。

授業中に、この週報の改修をちょろっと行った。 この週報は、あまり表現力を高めたくない気持ちがあって画像を使っていなかったが、動画やツイートくらいは貼りたい気持ちがあったので shortcodes とかいう機能を使って埋め込みできるようにした。

例えば YouTube 埋め込みはこんな感じになる:

ツイートはこんな感じ:

いい話。 まあ、ツイート経由で画像は貼れてしまうが、あまりドカドカ貼らないようにはしようと思う。 コードに関しては、リポジトリ見ればわかるので省略。 やはり X は中途半端なのかバカなのかところどころ twitter.com が残っている感じだった。 というのも x.com だとうまく埋め込みが機能しなくてカス。結局名前を変えるならちゃんとしてほしい。

授業終了後、またゴミケに戻りパソコンをしばいていた。

夜ご飯は食べないつもりだったが、適当にパソコンをしていると流石に頭が回らなくなってきたので「つけめん・まぜそばむじゃき」に行った。

帰宅後、残っていたタスクを片付けていたが、眠気の限界が来て寝落ちしてしまった。 直前の記憶として、長い不快な揺れを感じたので、地震の時刻的に多分 23:30 くらいに寝たと思う。

12/9

5 時くらいに目が覚めてしまった。 結局クネクネしていたら 7 時くらいになってしまった。 朝ごはんを食べたり、なんなりしていたら 8 時半くらいになったので大学に行った。

今日は1日中ゴミケのシフトに出ていた。 面白そうなものはちょくちょく出ていた雰囲気だった。

放課後くらいまで適当に作業をしていると、どうやら今日は WORD 編集部の時期編集長決めらしいとのことで、その会議に向かった。 めちゃくちゃ人が集まっており、わちゃわちゃしていた。

IPC ミーティングに行くついでに謎の椅子の運搬を手伝った。

適当に作業をしつつ AC 部屋に戻ると、大元に行くとかいうことになったため、ついて行った。 既に適当に食べていたため少しでいいかな、と思っていたが思っていたよりも食べてしまった。 まあ美味しかったのでよし。

古いデバイスの話や、FPGA ボードで音を扱う話などをした。 途中、創作の話になり、毎週絵を描き、曲を作るなどすると良いみたいな話をした。 正しすぎる。

AC 部屋に戻ったあと、IPC ミーティングで出た話題である大学の用語の IME 辞書を作っていた。 ある程度の実装はすくできた。Deno + TypeScript で辞書ファイルを各プラットフォームごとに生成する君を作った。

until-tsukuba/tsukuba-dictionary に全てが置いてある。

帰宅後、やらないとまずい書類を片付けていた。 マイナンバーカードの更新期限がやばいなぁと思いながらオンラインでやろうと思ったが、どうやらスマホを大学に忘れたらしくできなかった、バカ。

いろいろとパソコンをしていると深夜 3 時を回っておりさすがに眠すぎたため就寝した。 結局部屋の片付けは途中のままなのでよくない。

12/10

起きたら授業が始まっており驚愕。 遅刻しつつも、授業には出た。

Twitter を開いたらめちゃくちゃツイートが伸びていて困った。

困った。まあいいけど。 なんで夏にツイートしたやつはあんまり伸びなかったのにこのタイミングのはめちゃくちゃ拡散されるんだ、意味わからない。

授業では、適当に課題をやりつつ、途中で飽きたので AtCoder の過去問に手を付けるなどしていた。 さすがに、writeup というかそういうのをまとめるのを作りたくなってきている。 雑に Scrapbox とかでもいいとは思うんだが、さすがに記法が慣れない。

終了後、アセスメントの面談があるとかで AC 部屋に行って面談をした。 アセスメントは、友人の勧めで受けてみることにしたもので、なんか自分の特性やらがわかるらしい。 面談とはいってもなんかただただ会話するだけだった。 メール 1 年間無視してすみません、みたいなことを話した。本当にごめんなさい。 途中「忘れ物が多くないか」とか聞かれて大学にスマホを忘れていることを思い出した。 自分のデスクを探してみると、確かにあった。「あ〜、ちょうど昨日忘れ物しましたね……」と情けない返答をした。

夕方からは、ゴミケの片付けやらをした。 かなり強い FPGA ボードが出てきたらしくアツい。 SFP がそのまま刺さるし、いろいろできそうな見た目だった。

どうやら夜から Ultra-Coins のミーティングがあるとかなんとかで、3D 棟に向かった。

なぜか問題解決中とかいうよくわからないシール作成がされた。

この謎のロゴは Gemini に投げて作られたらしく、かなり驚いた。 AI ってやつは人間よりもコラ画像を作るのがうまいようだ。

思い出したかのように tsukuba-dictionary の GitHub Actions をしばいた。 とりあえず Release に出るようになった。 出るようにはなったが、肝心の辞書データは本当に適当。

適当に AC 部屋で、パソコンをしていたり、先輩と購入しようとしているカメラについて相談していたりした。 予算の都合で、新しめの APS-C を買うか、一世代まえのフルサイズを買うかという感じになっている。 かなり悩ましい。

そんなこんなで、Rust や Verilog をシバいていると、後輩から「鍋間違えて 4 人分作ってしまったので食べに来い」という電話が来た。 なぜ私が呼ばれたのかよくわからない。なんというか逆パシリのようではないかと感じた。 まあ、時間ある上、何も食べていなかったためちょうど良いなとなり、行った。 確かに鍋はあったが、ある程度食べ進められていたのか、4 人分にしては若干少ないくらいの量だった。

そんなことよりも、部屋がとてもカオスみがあって面白かった。

帰宅後、すぐに寝たんだろうけど、記憶がない。 GitHub のコミット日時を見るに多分 5 時くらいに就寝したと思うし、多分寝るまでパソコンをしていたんだと思う。

12/11

労働があったため、8 時くらいに起きた。 適当に準備をして電車に乗った。

どうも今日は、やる気が出ない上にハチャメチャに眠かった。 昼食に、唐揚げ定食を食べた。 唐揚げは美味しい。好きな惣菜発表ドラゴンが発表しているだけある。

夕方にかけて眠気も取れてきたので、後半で進捗をたくさん産んだ。

退勤後、会社にいる知り合いとご飯を食べ、カメラを見て回ったりした。 昨日悩んでいたカメラの実物を見た。 話を聞いていると、もっと悩ましくなってしまった。困る。

つくばに戻ってきたら眠気が MAX だった。 しかし、久しぶりにゲームセンターに寄ってみたくなってしまい、何故か寄ってしまった。 眠いのにバカすぎる。 そういえば、矢印を踏む音ゲーをやったことなかったなぁと思い、やった。 思っていたよりも面白かったが、眠気 MAX なのに体を動かすゲームをやるのはもっとバカだった。

ヘトヘトになりながらも帰宅した。 帰宅後、Advent Calendar の担当日が明日なのに一切記事を書いていないことに気づき、眠い目をこすりながら急いで書き上げた。 「Siv3D で FeliCa リーダーを使う」というタイトルで Zenn に投稿した。 なんだかんだで、Siv3D Advent Calendar は 6 年連続になるらしい。時が経つのは早すぎる。

書いたあと、寝ようと思ったが何かを忘れていそうだった。 Todo リストを漁ると、どうも会社のインサイダー取引防止講座みたいなやつの受講期限が迫っているようだった。 急いで講座を受けてなんとかした。 インサイダー取引ってやつ、ここまで厳重に取り締まったり監視したりしているのだなと関心した。 私はまだ株取引とかその類のことはやったことが無いが、もし将来的にやるときになったら気をつけたいと思った。 (というかやるときになったら面倒なため、関わっている会社の株は一切買わないなぁと思った。)

寝ようと思ったが、とあるサイトの API サーバのリバースエンジニアリングというか解析というかに熱中してしまい、結局バカみたいに遅い時間に寝た。

12/12

15 時起床。 起きたら全ての予定をふっとばしていてさすがに血の気が引いた。 今から行ってもなぁとなっていて家でクネクネしていたら 16 時を回っており、COJT に大遅刻確定になった。 さすがに、行かないのは終わっているので、家を飛び出した。

大学に向かう途中でたまたま ICPC のコーチに会った。 また私もたまたまコーチの賞状を持っていたので、その場で渡した。 突然渡すのもやべぇ奴すぎるが、コーチは困惑するどころか「ありがとう」と言って受け取ってくれたので、まあタイミングとしてはちょうど良かったのだろうと自分に言い聞かせて授業に向かった。

クネクネしていたら COJT の授業が終わった。 今日も今日とて特段進捗は産んでいない。 さすがに残り日数がやばいなぁと思いつつ部屋を後にした。

AC 部屋で知り合いとオンラインで絵チャというものをやってみたり、コードを書いていたりして帰宅した。

rust-analyzer 壊れててこの日は無しで書いてたけど、普通に rustup update して rustup component add rust-analyzer したら直ってくれた。

記憶にないが、割と遅めな時間に就寝したと思う。

12/13

あった:ICTSC2025 二次予選、SECCON 14 Quals

12時半くらいに起床。 ICTSC が 14 時からと勘違いしていたので、かなり家を出るのが遅くなっていた。 大学に付き、チームメンバーが取り組んでいた問題を見るも、どうも私が取り組めそうなものは既に解かれているようだったので、解答を読んで日本語見るくらいしかしていなかった。 コンテスト自体はなんかかなり運営の不手際があり、チームメイトも不満が漏れていた。

ICTSC をやりながら、SECCON 14 Quals の問題に手をつけていた。 どうも Rev がかなり Solve が出ていて奇妙だったので、とりあえず AI に投げてみた。 簡単な問題では、配布物 (tar.gz) を投げつけるだけで解いてくれるものもあり、かなり驚いた。 ChatGPT というやつはアップロードしたファイルが /mnt/data に置かれて、内部で Python やら Unix 系のコマンドやらを使ってある程度は動かしてくれるらしい。

Rev は 6 問あったが、うち 2 問はチームメイトが既に通してくれていたらしいので他の問題に着手していた。

この日解いたのは

の 4 問。 Ez Flag Checker に関しては本当に ChatGPT に投げるだけでフラグが取得できた。 やばい、シンギュラリティすぎる。

Mini Bloat は、とりあえず投げたところある程度解析してくれた。 かなり Z3 で sat 解きましょうみたいな問題だったので、状況説明してソルバを ChatGPT に書かせたら通った。

aeppel は少し苦戦した。 とりあえず applescript-disassembler を見つけたのでこれに投げてみたが、どうもエラーで落ちる。 不思議に思ってバイナリを眺めていると、どうも内部にも scptFasdUAS があるとかで、どうやら中にも本体の compiled script が丸ごと埋め込まれいるっぽい。

とりあえず引き剥がす君を書いて inner.scpt を得た。

import pathlib
import sys

src = pathlib.Path("1.scpt").read_bytes()

m = src.find(b"scptFasdUAS")
if m == -1:
    raise SystemExit("no embedded 'scptFasdUAS' found")

start = src.find(b"FasdUAS", m)  # header
end = src.find(b"\xfa\xde\xde\xad", start)
if start == -1 or end == -1:
    raise SystemExit("failed to locate FasdUAS / FADEDEAD")

inner = src[start : end + 4]
pathlib.Path("inner.scpt").write_bytes(inner)

print(f"[+] wrote inner.scpt ({len(inner)} bytes), start={start}, end={end+4}")

あとは applescript-disassembler に投げるだけだと思っていたが、これもまた動かない。 literal 関数内の範囲外参照を握りつぶすようなパッチを当てることでなんとかある程度は吐いてくれるようになった。 その後は AI と壁打ちしながらフラグを見つけていった。

gyokuto はかなり時間がかかった。 LD_PRELOADfopen をフックして挙動を見ると、どうやら flag.txt が必要らしい。 ファイルを用意して実行してみると、なるほど flag.txt から output.bin を生成するバイナリのようだ。 いろんな値で動かしてみて、なんとなく output.bin のファイルサイズの法則が掴めてきた。

あとは Ghidra を入れて関数を眺めたり、デコンパイルしたソースを ChatGPT に食わせるなどしたら、なんとかフラグが出てきた。 途中、毎回 output.bin の sha256sum が変わるのでやばくね?となったが、なんとかなった。

ここでなんと Rev が全完できた。 嬉しい。

これまで、大学の、特に WORD 部屋で出ていたが、周りが壊れたアンプを直すとかでやかましい。 話を聞く感じ、どうもハンダ吸い取り機が必要とかだったので、一旦創房に移り、作業を眺めながら Crypto を考えていた。

裏でずっと Crypto の問題を ChatGPT に考えさせていたが、思考時間が 600 分を超えていた。さすがにおかしい。 てかこいつこんなに考えられるやつだったのかと関心していたが、さすがにそんなことはない。 多分コンテキスト長がいい感じに切れたとかで堂々巡りをしているのだろうと思い、一旦停止し、自分で取り組んでみることにした。

途中、集中力が切れたので一旦 Twitter を見たり、ABC を見たりしていた。 コードゴルフのツイートが流れてきたので、短くして C++ shortest を強奪した。

やはりこういうのは謎テクを知っていると強いなぁと思った。

なぜこんなときにコードゴルフが?と思ったが、このときちょうど TPC Discord で通話が発生しており、どうやらコードゴルフをしていたようだった。 ミュートにして話を聞きながら、「それ短く書けます」という係をしていた。 時間がある程度経ち、ちょうどよくなってきたので CTF に戻った。

アンプ修復の人々はどうやらもう諦めたような雰囲気だったので、WORD に戻った。

ふと PC が重いなぁと感じていたが、どうやらストレージの残りが 2GB を切っており戦慄。 とりあえずいらない docker image を消すなどして一時的にしのいだ。SECCON 終わったら整理しないとなぁと思った。

ピザを食べたりしたあと、数分寝落ちしていた。

12/14

ぬるっと 4 時くらいに起きた。 とはいっても 30 分から 1 時間くらいしか寝落ちはしていない。

さすがに、Web の broken-challenge の solve が増えてきたのでそちらに移った。 ChatGPT 曰く、SXG とかいうやつじゃね?となったのでその方針で解くことに。

グローバル IP 持ってると強いねぇと思ったので、早速自前のサーバに SSH……したが繋がらない。 どうも ping も繋がらん。 サーバは Ultra-Coins に置いてあるので様子を見に行ったが、なんかぶっ壊れたのかネットワークが外に出れなくなっていた。困った。

しょうがないので、Cloudflare tunnel 経由で解くことにした。

/hint から入手できた EC private key が、この問題の SXG 用の信頼ルート (CA 鍵) になっていた。 その CA により、hack.the.planet.seccon 向けの SXG を偽造し、Admin Bot に踏ませて document.cookie を外部で送信して回収することでフラグが入手できた。

ソルバは ChatGPT と壁打ちしていると、すぐに吐いてくれたので助かった。

適当にご飯をちょっと食べたりして、続きをしていた。 Crypto をさすがに解かないとなぁとなって、Crypto の人と問題を考えていたが、一向に考えがまとまらない。 これ以上考えてもらちがあかないので他のに移った。

とりあえず解けそうなのとして Web の dummyhole があった。 ありがとう。XSS クライアント問題好きすぎ、となったので早速解く。

明らかに /logout がヤバそうなのでおそらく、最終的にここに持ち込むのだろうとわかった。 また、ゴニョゴニョしていると、post.html の dynamic import と、URL の組み立ててで明らかなヤバい実装が見えた。

まとめると、

{ "title": "x", "description": "y", "image_url": ".attacker.com" }

みたいな payload.json があったとき、

curl -b "session=$SESSION" -F 'title=t' -F 'description=d' -F 'image=@payload.json;type=image/jpeg+json' http://dummyhole.seccon.games/upload

みたいにすると、json がアップロードできて、dynamic import の不備で ?id=../../images/.... みたいなところにアクセスすると任意の image_url で開けることがわかる。 さらに、image_url は単に web との concat なので web.attacker.com みたいなのを準備すれば iframe で開けてしまうという感じだった。

logout を最終的に踏むのは間違っていなそうで、checkOrigin が register/login/upload にしか適用されていないんだよな だから、logout はクロスサイトで叩けてやばい

みたいな考察をしていて、頑張っていた。 とりあえず /logout に submit するようなページに飛ばせたは良いものの、うまく発火してくれない。

もう一度コードを読むと、

<script>
  setTimeout(() => {
    const fallbackUrl = decodeURIComponent("<FALLBACK_URL>");
    if (!fallbackUrl) {
      location.href = "/";
      return;
    }
    location.href = fallbackUrl;
  }, 5000);
  const postId = decodeURIComponent("<POST_ID>");
  location.href = postId ? `/posts/?id=${postId}` : "/";
</script>

こうなっている。 なるほど、つまり 5000ms 後に発火するから、それの前の href の更新による遷移は止める必要があるようだ。 <FALLBACK_URL><POST_ID> に値を差し込めるが、これは encodeURIComponent を挟むので任意の値では無理っぽい。

かなり苦しかったが、これをずっと終了まで考えるも、うまく発火できるのは見つからず……

終了後、いろいろと読んでみると、どうやらこれの回避はいろいろとあるらしい。

悔しい〜〜が、なんとかギリギリ通過の順位らしい、嬉しい。

終わって提出用の writeup を書き終えたタイミングで異次元の眠気が襲ってきたのでそのまま椅子に突き刺さったまま寝ていた。

起きると、17 時くらいだった。あまり寝ていない。

その後は、ラーメンを食べたり、明日担当日のアドカレの記事を書いていたりした。 あとはみかんを食べた。

こんなことになるんかい、というやつをやった。 これ、液体窒素で凍らせるバライティー番組のアレじゃんとなった。

記事を書くなり、この週報を書いていたりしていたが、そんなことよりも明日の試験勉強を一切やっていないことのほうがヤバイことに気づいた。 さすがに終わりすぎるので、勉強しつつ、帰宅し寝た。