Lを探す日常

I lov esoteric programming

XSS Challenge (xss.shift-js.info) writeup

Web セキュリティに*1入門したくなってつばめプロの xss.shift-js.info を解きました。
(少なくとも問09までは)セキュリティの勉強じゃなくて esolang ゲームのような気もしました(esolang は初学者じゃないです)が、とりあえず全部解いたので解法を書いておきます。
複数解法ある問題も多いらしいので、これが想定解かどうかはわかりません。

  • CSP disabled
    • 01 (☆☆☆)
    • 02 (★☆☆)
    • 03 (★☆☆)
    • 04-1 (★☆☆)
    • 04-2 (☆☆☆ + 04-1)
    • 05 (★☆☆; 実装: ★★★)
    • 06-1 (★★★)
    • 06-2 (★☆☆ + 06-1)
    • 06-3 (★★☆ + 06-2)
    • 06-4 (★☆☆ + 06-3)
    • 07-1, 07-2 (★☆☆)
    • 08-1 (★☆☆)
    • 08-2 (★★★)
    • 09-1, 09-2 (★☆☆)
  • CSP enabled
    • 20 (★★☆)
    • 21 (★☆☆)
    • 22 (★★☆)
    • 23 (★★★)
  • 最後に

*1:いつも「入門する」にかかる格助詞がわからなくて困る

続きを読む

駒場祭 codegolf day2 writeup (or Haskellゴルフのすすめ)

この記事は TSG Advent Calendar 2018 の6日目です。
昨日は fiord さんの ちょっとしたlsのtips でした。

今日は駒場祭コードゴルフの writeup を適当に書いていきます。

駒場祭がありました

今年の駒場祭で TSG はライブ放送を行いました。強い人々が CTF や競プロ、AI のライブに参加していたのでそれらに関する記事もアドベントカレンダーでたくさん書かれています/書かれる予定ですが、私はまともなことは書けないのでコードゴルフについて書きます。
コードゴルフ大会ページ - 問題 - 提出一覧

Ruby 40byte

Rubyの提出一覧
問題を見て最初に思い浮かんだのが正規表現を用いる方法でした。とりあえずその方法を愚直に Ruby で書きました(44byte):

gets.gsub! /1(?!....1......1....1)/,?0;print

無駄に引数なしの print (引数がない場合グローバル変数 $_ を出力する)を使っていますが、それ以外はとても読みやすいコードです。
これを微修正したのが最短です(40bytes):

続きを読む

QEMU on Vagrant on Mac の環境構築メモ

やったこと

TSGソースコードリーディング分科会で Linux カーネルmmap を読むことになり、デバッグのために QEMU を動かした。
分科会前に直接 Mac 上で QEMU を動かそうとしたり色々試したがうまくいかず、分科会中に @jp3bgy プロや id:kaki_no_tane プロに見てもらってやっと構築できた。

開始前の環境

続きを読む

Rubyの正規表現で足し算 (2) 異なる桁数

この記事はTSG Advent Calendar 2017の10日目です。昨日の記事は id:gasin さんの SECCONにゆるふわ参加してみた話 - gasin’s blog でした。TSGでは(特に1年生の)新入部員を募集しています。
gasin.hatenadiary.jp

さて、TSGの先輩方と雑談しているときに出てきた「正規表現で2進数を扱ったりして遊ぶ」という話題を発展させて、正規表現で足し算の式が正しいか判定することについて考えます。
先日の記事「Rubyの正規表現で加算を判定する (1)」では次のようなRuby正規表現を書きました:

ADD2 =~ "1+0=1"
ADD2 =~ "011+001=100"
ADD2 !~ "1+1=0"

ADD10 =~ "1+1=2"
ADD10 =~ "486+001=487"
ADD10 !~ "123+456=789"

二進、十進それぞれ2番目の例において、数の先頭に余分な0が付いています。これは前回紹介した正規表現に「A,B,Cは全て同じ桁数」という制約があったためです。
今回の目標は、この不自然な制約を、「数の先頭に余分な0が付いていない*1」という(自然な)制約に変えて*2自然な形式の足し算を判定する正規表現を作ることです。

※完成したものはGistにあります

*1:非零の数は「1」から始まる

*2:逆に01+01=10のような文字列は受け付けない

続きを読む

Rubyの正規表現で加算を判定する

正規表現における「再帰」をご存知でしょうか。一部の正規(自称)表現では再帰的なパターンを定義できるような拡張がなされており、Rubyが使っているOnigmoの正規表現でも再帰の機能が利用できます。この機能は「田中哲スペシャル」と呼ばれて多くの人に愛されているはずなのですが、なぜか2進数の処理に関する記述がググっても見つからなかったので、ここで2進数(と10進数)の足し算について書きたいと思います。

続きを読む