task4233のめも

書きたいことをつらつらと

セキュリティ・ミニキャンプ 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で公開されています。以下にリンクを置いておくので興味があれば参照してください。

発展課題: 演算子の追加実装

<=>=といった演算子等を追加で実装しました。

言語実装では, 演算子の優先度を規定する必要があります。 例えば, C++では以下のように演算子の優先度が規定されています。

ja.cppreference.com

MC言語では, std::map< char, int >で, keyを演算子, valueを優先度として定義していました。しかし, >=<=では2文字必要であるため, std::map< char, int >ではこれらの演算子の優先度を格納出来ませんでした。

そのため, これらの値をenum型で新たに定義することで, 2文字以上の演算子も定義することが出来ました。

制作過程はこちらのPullRequestを参照してください。

三項演算子の実装

三項演算子?を実装しました。

文法は, condition ? expression1 : expression2です。conditionがtrueならexpression1が評価され, falseならexpression2が評価されます。

一般的にコンパイラの読み取りは一方通行なので, 解析時にどのようにすればASTを構築できるかを考えるのに苦労しました。

講座で得られたこと

得られた知見はツイッターで適宜呟いていたので, 抜粋してコメントしていきます。

Google Summer of Code

Google Summer of Codeとは, 公式サイトによると, より多くの学生がOSS開発に取り込むことに焦点を当てたグローバルプログラムで, OSS組織と協力して3ヶ月間続けるプロジェクトです。Yuka Takahashiさんは積極性と英語力があれば行けるでしょうと仰っていました。

UNIX初心者におすすめの本

チューターの方が「UNIXに初めて触れるならこの本がおすすめ」と仰っていました。

puts vs printf

putsはprintfよりも速いようです。誤差なので気にするようなことではないと思いますが, 何度も出力する際はputsを使用した方が良いと思います。

C++における正規表現

参加者の中でパターンマッチを利用している方がいらっしゃいました*2C++でも出来ないことはないだろうと考えていましたが, 実際にあることを確認していなかったためいい機会になりました。

専門講座: 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関数を用いて画面に出力(発展課題)

シェルもどきを作る(趣味)

OS_Girls 2を参考にI/Oを実装しました。

講座で得られたこと

最も大きかったのは, ポインタとアドレスの理解が深まったことだと考えています。元々, ポインタとアドレス自体はある程度理解していたのですが, 今回のミニキャンプを経て更に理解が深まりました。特に, Cのコードをアセンブリに変換して考える部分が最もしっくりきた部分でした。

おわりに

以上が参加記録になります。

今回のミニキャンプを振り返ると, 参加者が主体となって構成されているイベントだと強く感じました。一般的なイベントでは, 公演の拝聴やハンズオンはあれど, 基本的に主体はイベントを開催している側でした。しかし, ミニキャンプでは参加者が何かをしたいと言えば, それを講師やチューターの方が一緒に解決してくださるという内容だったと記憶しています。

その点で, ミニキャンプは参加者が中心となって何かができるイベントと言えるのではないでしょうか?

このミニキャンプは他の場所でも開催されています。興味のある方は, ぜひ参加してみてはいかがでしょうか?

*1:事前課題が本講義のような気がしました

*2:実名は控えさせていただきます

*3:これQ Emulatorの略だったんですね

*4:解釈違いの部分があればご指摘お願いします