セキュリティ・ミニキャンプ in 山梨 2019 参加記
TL;DR
- ミニキャンプの概要共有
- ミニキャンプで得られた情報の整理
もくじ
はじめに
2019年9月29日(日)に開催されたセキュリティ・ミニキャンプ in 山梨 2019に参加しました。この記事の目的は, ミニキャンプの概要を共有することとミニキャンプ中に学んだことを私なりにまとめて共有することです。
大学の講義や教職課程の介護等体験などで忙しく, 公開までに2週間ほど経ってしまいましたが, なんとか公開できてよかったです。
セキュリティ・ミニキャンプとは
IPAによると以下のように書かれています。
全国における情報セキュリティ人材の早期発掘と育成を目的に、各地で専門講義を実施しています。全国大会と比較して、期間が1日程度と短いことから「ミニキャンプ」とも称しています。対象は25歳以下の学生で、参加するには、応募課題を提出し、合格する必要があります。
期間は1日と短いですが, 内容は一般的な講義と比較して濃かったです。
詳しくは, 以下のリンクを参照してください。
専門講座: ミニキャン言語を作ってみよう!
講座概要
自作言語であるMC言語を実装する講座でした。 この言語は, フロントエンドでLLVM IRを出力するC++コードを採用し, バックエンドにLLVMを利用しています。
このおかげで, 私たち人間はC++コードを書くだけで, 最適化まで行われた実行形式のバイナリを入手することができます。
基本的に実装は事前課題*1で行い, 本講義では実装した部分の解説と実装を行いました。
講座前に行ったこと
3回分の事前課題
第1回課題はコメント+参考コード付き, 第2,3回課題はコメントのみ, 発展課題はノーヒントでした。 書く課題はYuka TakahashiさんのGitHubで公開されています。以下にリンクを置いておくので興味があれば参照してください。
- GitHub - yamaguchi1024/mc-lang-1: セキュリティミニキャンプ2019山梨 MC言語講義
- GitHub - yamaguchi1024/mc-lang-2: セキュリティミニキャンプ2019山梨 MC言語講義 第二回事前課題
- GitHub - yamaguchi1024/mc-lang-3: セキュリティミニキャンプ2019山梨 MC言語講義 第三回事前課題
発展課題: 演算子の追加実装
<=
や>=
といった演算子等を追加で実装しました。
>=と<=の実装が出来ました!
— Tasker (@task4233) September 19, 2019
Enumを使ってこなかったので知らなかったが, Enumはかなり便利だった。 pic.twitter.com/WlzR8I6yH6
言語実装では, 演算子の優先度を規定する必要があります。 例えば, C++では以下のように演算子の優先度が規定されています。
MC言語では, std::map< char, int >
で, keyを演算子, valueを優先度として定義していました。しかし, >=
や<=
では2文字必要であるため, std::map< char, int >
ではこれらの演算子の優先度を格納出来ませんでした。
そのため, これらの値をenum型で新たに定義することで, 2文字以上の演算子も定義することが出来ました。
制作過程はこちらのPullRequestを参照してください。
三項演算子の実装
三項演算子?
を実装しました。
三項演算子を実装できました!
— Tasker (@task4233) September 28, 2019
左側がmc言語で書いた再帰版gcdのコードです。
右側の一番下で,
gcd(831, 3601) = 277が正しく計算できているのが分かると思います。
他に追加すると面白い機能ってなんだろうか。 https://t.co/o1b4LqyRqV pic.twitter.com/daIcCPVoUo
文法は, condition ? expression1 : expression2
です。condition
がtrueならexpression1
が評価され, falseならexpression2
が評価されます。
一般的にコンパイラの読み取りは一方通行なので, 解析時にどのようにすればASTを構築できるかを考えるのに苦労しました。
講座で得られたこと
得られた知見はツイッターで適宜呟いていたので, 抜粋してコメントしていきます。
Google Summer of Code
Google Summer of Codehttps://t.co/qKMpskxqPh
— Tasker (@task4233) September 29, 2019
Google Summer of Codeとは, 公式サイトによると, より多くの学生がOSS開発に取り込むことに焦点を当てたグローバルプログラムで, OSS組織と協力して3ヶ月間続けるプロジェクトです。Yuka Takahashiさんは積極性と英語力があれば行けるでしょうと仰っていました。
UNIX初心者におすすめの本
はじめてUNIXで仕事をする人が読む本https://t.co/ZquKOrShic #seccamp
— Tasker (@task4233) September 29, 2019
チューターの方が「UNIXに初めて触れるならこの本がおすすめ」と仰っていました。
puts vs printf
putsはprintfよりも速い。
— Tasker (@task4233) September 29, 2019
知らなかった。https://t.co/gmn7oXxCCJ#seccamp
putsはprintfよりも速いようです。誤差なので気にするようなことではないと思いますが, 何度も出力する際はputsを使用した方が良いと思います。
C++における正規表現
C++11における正規表現はstd::regex_match()が使用できる。https://t.co/yPR5YtfG1n
— Tasker (@task4233) September 29, 2019
これも知らなかった。#seccamp
参加者の中でパターンマッチを利用している方がいらっしゃいました*2。C++でも出来ないことはないだろうと考えていましたが, 実際にあることを確認していなかったためいい機会になりました。
専門講座: OSの力を借りずに起動するアプリを作ろう
講座概要
UEFIアプリケーションを作成して, QEMU*3上で動かす講座でした。 Qiitaの記事によると, UEFIは以下のように説明されています。
UEFIとは、一言で言うと「最近のPCやサーバーに入っている、新しくて高機能なファームウェア(及びそのインターフェースの仕様)」です。
したがって, 本講座のタイトルにもある「OSの力を借りずに」というのは, 「OSの力を借りずに, UEFIアプリケーションをUEFIの力を借りて 起動するアプリを作ろう」のことだと解釈しています。*4
実装は, EDK IIを用いて行いました。
os-devによると, EDKⅡは以下のように説明されています。
EDK II は元々、UEFI の開発に深くかかわっている Intel が作っていた SDK です。gnu-efi が「UEFI アプリケーション」専用なのに対し、EDK II は UEFI アプリはもちろん、周辺のライブラリや、UEFI ファームウェアそのものを開発するための SDK という役割も持っており、超高機能です。高機能ゆえに UEFI アプリを作るという目的のためには複雑すぎてとっつきにくい印象があります。が、フル装備の SDK ですから、慣れておけば後々困ることもないと思います。
講座前に行ったこと
いくつかの機能を実装しました。 具体的に実装した機能は以下の通りです。
EDK IIを用いたハローワールドアプリの作成(事前課題)
EDK IIを用いてUEFIアプリケーションを作成しました。 EDK II で UEFI アプリケーションを作るを参考に作成しました。
アプリケーションのメモリマップをファイルに保存する(事前課題)
ここでやるべきことは2つです。 1つ目はアプリケーションのメモリマップを取得すること, 2つ目はファイルにその情報を保存することです。
まず, アプリケーションのメモリマップを取得するためには, EFI_BOOT_SERVICE.GetMemoryMap()を用います。このメソッドは, アプリケーションのメモリをマッピングしたものを読み取ることが出来ます。このメソッドの詳細は, UEFI Specificationの7.2 Memory Allocation Servicesを参照してください。
次に, ファイルにその情報を保存するためには, EFI_FILE_PROTOCOLおよびそれに関連するメソッドを利用します。これらのメソッドの詳細は, UEFI Specificationの13.5 File Protocolを参照してください。
MC言語で定義した関数が出力した値をPrint関数を用いて画面に出力(発展課題)
ミニキャン言語でフィボナッチ数列を実装できた! pic.twitter.com/BFYgEopr6L
— Tasker (@task4233) September 21, 2019
シェルもどきを作る(趣味)
edk Ⅱ上のUEFIアプリケーションで動くシェルもどきが出来ました!
— Tasker (@task4233) September 23, 2019
「すごい、ちゃんと動いてますね!」
コマンド入力は, #OS_Girls 2を参考にして実装しました。 https://t.co/o1S5t7xBPr pic.twitter.com/Bl948JdPmU
OS_Girls 2を参考にI/Oを実装しました。
講座で得られたこと
最も大きかったのは, ポインタとアドレスの理解が深まったことだと考えています。元々, ポインタとアドレス自体はある程度理解していたのですが, 今回のミニキャンプを経て更に理解が深まりました。特に, Cのコードをアセンブリに変換して考える部分が最もしっくりきた部分でした。
おわりに
以上が参加記録になります。
今回のミニキャンプを振り返ると, 参加者が主体となって構成されているイベントだと強く感じました。一般的なイベントでは, 公演の拝聴やハンズオンはあれど, 基本的に主体はイベントを開催している側でした。しかし, ミニキャンプでは参加者が何かをしたいと言えば, それを講師やチューターの方が一緒に解決してくださるという内容だったと記憶しています。
その点で, ミニキャンプは参加者が中心となって何かができるイベントと言えるのではないでしょうか?
このミニキャンプは他の場所でも開催されています。興味のある方は, ぜひ参加してみてはいかがでしょうか?