ふるつき

v(*'='*)v かに

telescope.nvimのfzf extensionを使いつつfzfはrgバックエンドにしてるんだけどなんかfind_filesで.github以下が見つからなくてworkflowファイルの編集のときだけ毎回:tabnewしている人向けのtips

~/.rgignore!.github/ って書いておいたら良い。ということが https://github.com/BurntSushi/ripgrep/blob/master/GUIDE.md#automatic-filtering に書いてあります。

タイトルのtelescopeとかfzfとかはミスリーディング

はてなブログの自作テーマのCSSをGitHub Pagesでホスティングして本番反映を楽にするテク

はてなブログにはテーマという概念があって、ブログのデザインをガッと変更できる。

テーマははてなブログオフィシャルのテーマやテーマストアにあるものをインストールしてきても良いけど、自分で作ることもできる。ちょっと見た目を変えたいブログができたので、一個テーマを作ってみた。誰かに使ってもらいたいということはないので、テーマストアでは公開してない。

github.com

上記自作テーマはHatena-Blog-Theme-Boilerplateというのをベースにしている。このボイラープレートはどうやってテーマを作っていけば良いとか、どこにスタイルをあてたらよいとか、ブログに実際に反映するには、とかがさっとわかるようになっている。そして、デザインテスト用のブログを一つ作っておけば手元のviteでHMRした結果がさっと確認できてめちゃめちゃ体験が良い。

github.com

というのが前節で、ここからが本題。

Hatena-Blog-Theme-Boilerplateでめちゃめちゃインクリメンタルに開発できるのは嬉しいけど、実際にブログに反映するところだけが面倒。普通にやるとnpm run buildしてできたbuild/boilerplate.cssクリップボードにコピーして、ブラウザで自分のブログの管理画面を開いて、デザイン設定画面でCSSを設定して……とするか、自作のテーマをテーマストアに登録しているなら、テーマを更新して……ということをする必要がある。

本当はなにかAPIがあってblogsyncみたいな感じでコマンド一発でできてほしいけど、いまところはてなブログはそういうAPIを提供していなさそうなので別の方法を考えた。

作戦はこう

  1. GitHub Actionsで npm run build するようにして、成果物のCSSGitHub Pagesでホスティングする
  2. 自分のブログのデザイン設定に @import "https://*.github.io/.../boilerplate.css"; とかいて、成果物のCSSをインポートする

ということで、Hatena-Blog-Theme-Boilerplateをテンプレートとして作ったリポジトリで以下のようなGitHub Actionsを走らせている。

name: build theme css and upload
on:
  push:
    branches:
    - master
  workflow_dispatch:

permissions:
  contents: read
  pages: write
  id-token: write

concurrency:
  group: "pages"
  cancel-in-progress: false
  
jobs:
  build:
    runs-on: ubuntu-latest
    steps:
    - uses: actions/checkout@v4
    - uses: actions/setup-node@v4
      with:
        cache: 'npm'
    - name: build
      run: |
        npm ci
        npm run build
    - uses: actions/configure-pages@v3
    - uses: actions/upload-pages-artifact@v2
      with:
        path: ./build

  deploy:
    needs: build
    runs-on: ubuntu-latest
    environment:
      name: github-pages
      url: ${{ steps.deployment.outputs.page_url }}
    steps:
      - uses: actions/deploy-pages@v2

これで、ローカルで開発した自分用のブログのテーマを本番に反映するには、GitHubにpushするだけで良くなって便利。

一方微妙ポイントもいくつかある。

以上をまあいいかと思える人は自己責任で真似しても良いです。

実は既出の技だったとか、もっと良いテクがあるとかを知っている人がいたらぜひ教えてください

CakeCTF 2023 作問感想

この記事はCTF AdventCalendarの-15日目の記事です

こんにちは。公式writeupっぽいやつは早く出しすぎると参加者が「じゃあ自分はwriteup書かなくてもよいか……」と思ってしまうのでしばらく経ってから出したほうが良いと思っているので寝かせていました。まだ書いていない人でこれを読んでいる人はぜひ運営へのねぎらいだと思ってwriteup書いてください。

以下は解説というよりは感想です。出題した問題はGitHubで公開してます。solverも入っているので詳しい解き方を知りたい人はそちらを見てください(あと解いた人のwriteupを読んだりしてください)。

github.com

[crypto/warmup] simple signature (88 solves)

なんか昔つくった問題なのでよく憶えていません……。昔なんかいい問題を作ろうと思ってがちゃがちゃやっていたときにできた何やっても解ける問題を拾い上げてきました。

kanonさんがwriteupにいいことを書いてくれてるんですが、”基本的に、公開鍵と秘密鍵は何か数学的な関連性が必要であるから解けないわけで、今回は x, uが公開鍵にしか使われていないため、なんでもおk”です。適当に値を決め打ちしてそれで辻褄が合うようにすると解ける。

一見難しそうに見えて普通に数学やると解けるのでwarmupです。

[rev] Cake Puzzle (56 solves)

これは非常にシンプルな15パズルで、さくっとreversingしてさくっとソルバ拾ってきて解くだけです。

reversing何もわからないのに無理やり何か作ろうとして結局このあたりに落ち着きました。特に面白いことはないので、出したことは多少以上に後悔してます。

[crypto] janken vs yoshiking 2(43 solves)

janken vsシリーズ、または vs yoshiking シリーズです。これまでの作品はzer0pts CTF 2021に出題したjanken vs yoshiking, SECCON CTF 2022 Qualsに出題したjanken vs kurenaifです。jankenは本当に便利な題材で、手の種類が3通りしかないのでweakなパターンを作りやすいですよね。

さて、今回はyoshikingは \mathbb{F_p}上の5x5のランダムな行列 Mに対し M^rを計算してくれて r \mod 3がyoshikingの手です。 pはsmoothですが一般線形群 GL_5(\mathbb{F_p})では特に嬉しくないです*1。どうにかして離散対数問題を解いて rを求めたいですね。

そこで一般に \det(A^r) = \det(A)^rだねということを思い出して \det(M), \det(M^r) = \det(M)^rを取るとdeterminantは \mathbb{F_p}上の計算ですから、このdiscrete logはPohlig-Hellmanで楽に解けるのでじゃんけん勝ち放題という問題でした。

行列の冪乗が出てきたときに行列式を考えたりジョルダン標準形を考えるのは典型だと思っているのでもうひと工夫しても良かったなと思います。あと、janken vs yoshikingを作問したときもp-1が3を位数に持っているとか持っていないとかで非想定の解法を作ったのに今回もそういう解き方のことを失念してたのも良くないですね*2。憶えてたら pはランダムに生成してたと思います。まあでもpがsmoothなことでmod pで考えたくなるという誘導にはなったので別に良いか。良いような気もします

[crypto/pwn] decryptyou (13 solves)

zer0pts CTF 2022に(ptr-yudaiが)出題したsignmeという問題は crypto + pwnの問題で、RSA-CRTによる署名時に一時変数を破壊できるので素因数分解できて……という問題でした。今回出題したdecryptyouはcrypto + pwnの問題でRSA-CRTによる復号をしてくれるのですが、pwn要素によって復号時に一時変数 u = p \mod qを破壊できます。

RSA-CRTにおける復号では m_p = c ^{d_p} \mod p = m \mod p, m_q = c^{d_q} \mod q = m \mod qとしたあとgarnerのアルゴリズム m = ( (m_p - m_q) u \mod p) + m_q \mod nとして mを復元します。このとき uが壊れているとして

  1.  m \le pであれば m_p m_qは同じ値になるので m_p - m_q = 0となり、garnerのアルゴリズム (m_p - m_q) u \mod pの部分は0なので uが壊れていても uの影響は mに届かないので復号に成功します
  2.  m > pであれば uが壊れているので復号に失敗します

というオラクルが手に入るので、復号に成功するかをみつつ二分探索すると pがわかるという解法を想定していました。しかしこんな解き方をしている人は誰もいなくて、 uが壊れているときその復号結果は \mod pでは mかつ \mod qでは非 mとなるような値 m'なので、 m - m' nでない pの倍数になり得る*3ということを利用して解かれているようでした。

……これはsignmeの解法とほとんど一緒です。自分たちの過去問と同じ問題を出してしまった……が、ばれてないのでセーフ!!!!!*4

違う問題!(同じ問題だった……)

[crypto] Iron Door (8 solves)

今回のボス問題です。唯一lunaticタグがついていたpwnのbofwowは22 solvesあることを考えるとこの問題にlunaticがついてないのはおかしい。

この問題については簡単に説明するのが難しいのですがCakeCTF 2022に出題したRock Doorの改題で、以前はDSAの r, kが小さいのでLLLで解ける……という問題でした。今回は rは小さく、 kは大きい、ただし k^{-1} \mod qは小さいという問題設定になっています。

とりあえず s_jr_ik_i^{-1} - s_ir_jk_j^{-1}を考えると、両方の項に xr_ik_i^{-1}r_jk_j^{-1}が登場するので xを消去でき、剰余の方に比べて小さい値になることが期待できるので、係数 r_ik_i^{-1}, r_jk_j^{-1}をLLLで求めることができます。

続いて、 s_i \equiv z_i k_i^{-1} + xr_ik_i^{-1} \mod qという式は s_i, z_i, r_ik_i^{-1}既知で xは未知だがすべての式で共通、 k_i^{-1}が式ごとに異なる比較的小さな未知数なのでこれは典型的なHidden Number Problemのインスタンスです。

したがってこれを解けば xが求められる、という問題でした。2段階のLLLが登場してこれは難しいぞと思いましたが、実際にはただLLLなので難しいだけで、解かれた方は大体二段階目のLLLはやらずに r_ik_i^{-1}素因数分解するという方針で解かれていたようでした

感想

毎年「このCTFで持ちネタ全部尽きたぁ。終わりだぁ……」と思っているけど、実際にやってみると簡単な問題もそこそこ難しい問題も作れているような気がします。……が、これは罠で、よく見るとjanken vs yoshiking 2もdecryptyouもIron Doorも過去の問題の焼き直しです。もう本当にだめ

インプットを怠った結果アウトプットが枯渇している状態だと思うので、来年のCakeCTF開催のためにもいろいろなCTFに参加していきたいですね(口だけオバケ)。

あとReversingとWebは本当に作れないので協力してくれる人を募集しています

それではさようなら

*1:確信はないです

*2:多分一般線形群の位数が3で割り切れるとき位数/3乗すれば解けます

*3:m' = m + kpとかけるので、m' - m = kpとなる

*4:断じて否。解いた人はちゃんと気がついて糾弾してください