進路

2020年3月に東京農工大学博士前期課程を修了します。1 学部時代を含めると計6年間 (1年間の休学期間を除く) 通い続けた大学でした。

今回は今までやってきたことの振り返りと、今後どうするのか、についてです。ポエムです。なるべく短くしたつもりですが、ちょっと長いかもしれません。

今まで何をやってきたのか

競技プログラミング

大学に入った当初は特に目的もなく、なんとなく将来も仕事がありそうだなくらいの感覚で選んだ情報工学科だったため、とりあえずMCCというコンピュータ系のサークルに入って競技プログラミングを始めました。 チームでACMが主催するICPC (国際大学対抗プログラミングコンテスト) にも出場したりしたのですが、競技プログラミングはあまり肌に合わなかったようで、特にレートを上げることもありませんでした。
もともと考察が好きだったので、ICPCに出場した時は閃き系問題の解法を考えたり、環境構築やデバッグを担当していました。他の二人はバンバンコードを書くタイプだったので、チーム的にはうまくマッチしていました。 最後の年は国内オンライン予選で5位 (大学別2位) に食い込んだりもしたので、それなりにうまくやれていたのかなと思います。

CTF

競技プログラミングを初めて一年後くらいに、同サークルに所属していた @Shift_Crops から声をかけられて初めたのがCTFでした。 「CTFって何?」と聞いたら「パズルみたいなもん」と言われて、なんとなく面白そうだなと思って初めたのがきっかけです。 当初はCTFブームが始まりかけくらいのころで、オンラインに転がってる問題はksnctf, akictfくらいしかなかったのを覚えています。
コンピュータのことはほとんどわからず、base64も知らずにヒントをもらいながらようやく解いたonionが初めて解いたCTFの問題だった気がします。 しばらくの間は誘ってもらった @Shift_Crops と、MCCの同期何人かでtuat_mccという名前でたまにオンラインCTFに出てたりしてました。

少しして、当時交流のあったMMAとCureSecureとお試しで合同チームを組んで、RuCTFEに出ることになりました。 結果は100位、ほとんど何もできませんでした。 f:id:icchyr:20200219215236p:plain

そしてその時のチームが今のTokyoWesternsに至ります。当初に比べるとメンバーも増え、世界ランキングにも食い込める成績を残せるレベルまでなりました。

研究

大学では、学部4年生になるまでは競プロやCTF以外は特に何もしませんでした。 学部4年生で研究室に配属されて、なんとなくマルウェア検知をやりたいという漠然とした考えだけがあり、最初のうちはDECAFDRAKVUFを弄って、なんとなくWindows APIフックができてすごいなあくらいのことをやっていました。
@ntddk の一生あとで読んでろには大変お世話になったのを覚えています。 彼が同年代だったこともあり、僕自身にとっても大きな刺激になっていたと思います。

しばらくいろんなサンドボックスを触った後、指導教官から急に「BitVisorってのがあるんだけど、触ってみない?」と言われ、とりあえずどんなものかと動かしてみました。 当時はVMMどころかシステムプログラミングに関する知識もほとんどなく、ソースコードを読んでも正直何をしているのかさっぱりわかりませんでした。
ネットに転がっているQiitaの記事や、BitVisor Summitでのスライドを漁りながら試行錯誤していたら、なんとなくBitVisorの改造方法がわかってきて、BitVisorを使ってマルウェア検知機構を作ろうということになりました。 マルウェア検知機構のロジックをVMM内で記述できたら面白いなと思い、LuaとLibVMIを組み込んでいい感じのシグネチャマッチングを書けるシステムを目指しました。 いろんなライブラリの移植を試みる課程でリンカの仕組みを調べたり、JSONパーサを書いたり、時にはファイルシステムやメモリアロケータの実装をしたりしました。
実装の際にはいろいろ壁がありましたが挫折することはなく、競技プログラミングをやっていた経験が生きたのかな?と思っています。

そんなこんなでシステムプログラミングやVMMの作り方などの知識が身につき、すっかり低レイヤーに染まってしまいました。 主にBitVisorをベースとした研究をいくつか発表し、他の研究者の方たちから筋が良い(?)と評価して頂いたものもあります。

www.slideshare.net

CBCTF 2

TokyoWesternsを立ち上げて2年くらい経ったころ、交流のあったpotetisenseiから「新しいCTFを立ち上げたいんだが、一緒に手伝ってくれないか」と持ちかけられ、彼の持っていたアイデアに感銘を受けて協力することにしました。 当時お互いに交流のあったkanaさんに協力を仰ぎ、5年目を迎えたCODE BLUEというカンファレンスでCBCTFをやらせてもらえることになりました。
CBCTF 2017 (初回) はbinjaが温めてきた問題でJeopardyのみをやり、2回目の予選はオンラインでJeopardy, 決勝戦はpotetisenseiの考案した新しいCTF形式 Bull's Eye で行いました。 最初のBull's Eyeのバックエンドは全てRailsで実装されており、Rubyに明るくなかった僕はあまり開発に関われませんでした。 また本番はdocker-composeの謎挙動や、sidekiqの カスみたいな 仕様により円滑にコンテストを進行することができず、運営も炎上したし海外チームにも大きな迷惑をかけました。
なによりも、バックエンドをメインで開発していた @tyage が大半のバグ修正を行い、僕はアドホックな解決策を示すことしかできませんでした。tyageごめんね。

次年度 (2019) のCBCTFはバックエンドを完全に一新し、新たにGolangで実装することに決めました。 スコアサーバ側は既にある程度Railsで完成されていたので、ワーカーやスケジューラなど根幹部分のみを再実装することに決め、全部フルスクラッチで書きました。
実装はGitHubに上がってます。ちょくちょくひどいcommitとかがあるのは許して下さい。

github.com

Golangを選んだ理由の一つは、非同期処理がやりやすそうだなと思ったからです。実際にスケジューラを書き始めるまで知らなかったのですが、gRPCがちゃんとキャンセルできてエラーハンドリングも問題ないの便利ですね。context考えた人すごくないですか?あれめちゃくちゃ便利だと思います。
もう一つの理由は、依存関係のないシングルバイナリで出力されることです。PythonRubyなどのスクリプト言語でアプリケーションをデプロイした経験のある人はわかると思うんですが、パッケージ管理とか処理系のバージョンとかで躓くとかなり面倒なんです。 Golangだとアプリケーション単位でバイナリが一つ出てくるだけなので、デプロイがめちゃくちゃ楽です。新しくパッケージ追加してもバイナリの中に含まれているので、デプロイ先でpip installやbundlerを走らせけなければならない、ということがないわけです。 あと学習コストがそんなに高くないです。Rustとかに比べれば、の話ですが。

留学

CTFをやっていた関係で海外の人たちと交流が生まれ、UCSBのPhDを卒業後ASUで研究室を立ち上げた、元ShellphishのリーダであるYan Shoshitaishvili氏から「こっちで研究インターンをしてみないか」と言われ、修士1年を終えたタイミングで半年間ASUに研究留学をすることになりました。
ASUでは主にfuzzingのプラットフォームに関する研究を行い、現実世界のアプリケーションをなるべく低コストかつスケールする方法でfuzzingする手法を提案し、プロトタイプの実装を行いました。 半年間という短い期間だったので、テーマ決めや実装方針などを含めるととても足らず、論文を完成させる前にインターンは終わってしまいましたが、今でも引き継がれて続いているそうです。 詳しいことは書けませんが、別の研究チームも加わってより良いアーキテクチャになっています。そのうち論文が出るんじゃないでしょうか。

ASUで留学している間に様々な縁が生まれ、2019年のNDSSというトップカンファレンスのWorkshop on Binary Analysis Research (BAR) では招待講演をさせてもらったりしました。 同講演では、先ほどのBull's Eyeのコンセプトについての発表をしてきました。 聴衆の食いつきは良く、終わった後にアメリカの国防関連の人から話を聞かれたりもしました。 世界でも類を見ない新しいアイデアであり、評価はかなり高かったです。この辺はさすがpotetisenseiといったところでしょう。3

その他

TokyoWesternsとしてCTFをやっている上で、いろんなところで講義したり発表したりしました。 中でも一番有名なのはCODE BLUE 2019で発表したAVOracleだと思います。

これはWCTF 2019に持っていくために考えていた問題が原案となっており、Windows Defenderを使ってなんか面白いことやろうっていう状態からひねり出したアイデアです。我ながらよく思いついたなと思っています。一生に一度あるかないかくらいだと思っています。

他にもいろいろありますが、記事が長くなるので省略します。

これからどうするのか

外資系企業に行こうとしたりもしましたが、最終的には日本に残ることにしました。 理由は以下の通りです:

  1. 面接の準備がヘタクソすぎて受けた企業ほとんど落ちた
  2. 最終的に行きたい企業があったが、タイミングの問題ですぐに入れない状況だった
  3. 仮に外資系に行っても、最終的には↑の企業に行くつもりだった
  4. その企業から今年入社の誘いを受けたので無理に他を探す必要がなくなった

誘いを受けた企業はベンチャーなのですが、とにかく仕事内容が面白くて、まさに自分が求めていたものでした。 仕事内容もさることながらメンバーもトップクラスと呼べる人材ばかりが揃っており、このメンバーならなんでもできそうだな、と思ったのが決め手です。 どこの会社かは、多分そのうち明らかになると思うのでここでは言いません。 ちなみに口頭だけでまだ正式なオファーを受けているわけではないので、札束で殴るなら今がチャンスです。4


  1. 卒業が確定したわけではありません。修了要件を満たせなければ学部卒として生きていきます。

  2. この記事を書いてる途中に、この辺で酒を飲み始めています。以降おかしなことを書いていた場合、それが原因です。

  3. 本当の原案はint03さん (eggpodさん) だったそうです。そこからpotetisenseiがスコアリング方法などを考えた状態で僕のところに持ちかけてきたという形になります。

  4. 気持ち的にはほとんど決めているので、相当な条件じゃないと動かないです。多分