セキュキャン2022通過したので応募課題を晒す
ツイートを読み込み中...
やった~~!!!
ということで、セキュキャン2022、Y4「RISC-V CPU自作ゼミ」に参加させていただきます。めちゃくちゃ嬉しいです。最初に届いたメールは選考結果が発表されたというお知らせだったので、そこからサイトに飛んで、PDFを開いて(どこに結果が書いてあるのかしばらくわからなかった)、自分のIDで検索をかけてヒットした時はそれはもうびっくりしました。n度見しました。
せっかくなので、セキュキャン応募までのざっくりした過程と、応募課題をさらりと晒してみようと思います。
応募のきっかけ
セキュキャンという単語自体は去年とかその辺も聞いてた気がします。おぼえてないですが。ただ、名前の通りセキュリティを専攻する人向けかな~と思って特に何も思わず流し見していました。
そして今年、Cコンパイラゼミの @hsjoihs さんからの助言もあり、セキュリティ限定でないことを知ったので、参加しようと思ったわけです。
なんか書いて思ってたんですけど、このセクションいらなかったかもしれないですね(薄すぎ)
応募はリバースエンジニアリングゼミ→RISC-V CPU自作ゼミ→OS自作ゼミの順です。形式上はこの希望順ですが、実質ぜんぶ第一希望みたいな感じです。Cコンパイラゼミも含めた4択で無限に悩んでいました。
応募までの過程
過程と言うかスケジュールです。エントリー締め切りは05/16 23:59で、課題回答の締め切りは05/23 23:59でした。で、実際に提出した時間はどうだったかというと、エントリーが05/15 17:15あたり、課題回答は曖昧ですが締め切り1時間前くらいに提出したと思います。
前述しましたが、エントリー直 前までずっと希望ゼミを悩んでいたので遅くなりました。この影響で課題回答も遅くなってしまいました。嘘です。おおよそ絞ってからもずっと遊んでました。カスです。このせいで、全く触れたこともないSystem Verilog HDLの課題を3日で書く羽目になりました。時間のゆとりはいくらあってもありすぎではないと思います。というのを応募前の自分に言っても意味ないような気がしますが・・・。
まず先に終わらせたのはOS自作ゼミです。OS自作はもともと興味があったので、内容を考えるのにそこまで時間はかかりませんでした。といっても、リングバッファの実装をちまちまいじっていたらそこそこの時間になってしまいました。
次に終わらせたのはリバースエンジニアリングゼミです。こちらは触れたことがない用語の解説をしなければいけなかったのでちょっと大変でした。データシート読み取りも、ただ英語読むだけではわからない部分もちらほらあったので苦戦しました。
最後に終わらせたのはCPU自作ゼミです。。前述の通り、System Verilog HDLを全く知らない状態からなんとか完成させました。HDL自体の構文はもちろん、付属していた信号例の読み方もなんにもわからなくて相当苦労しました。
そもそも問題文に使われていた単語が全く分かりませんでした。アサートもデアサートもノリで理解しました。それに、HDLだけでFIFOを作ることができるというのも知りませんでした。プログラミング言語でいう変数みたいなもので管理できるとは知らず、FIFOを作るならデータを格納するための部品?みたいなのを設計しなきゃいけないのかな~と思ってました。
ただ、この課題は書いててとても楽しかったです。受からなくてもこの課題が出来ただけで有意義だなあと思っていました。こんな苦戦具合だったので、通過したのが驚きです。
課題
受かってない課題公開したところでかな~ともちょっと思いましたが、まあ公開しときます。
プログラムを提出する必要がある課題があるので、これらはGistsに載せておきます。
リバースエンジニアリングゼミ
単語解説では勝てないと思うので、応募のきっかけに注力しました。書いてある通り、応募のモチベーションはBrainuxです。リバースエンジニアリング、めちゃくちゃ面白そうなので、何かしらの機会に学べたらな~と思ってたのですが、今回は叶わなかったようです。
問1
以下の技術用語について解説してください。またどのようなところで使われているかも述べてください。わからない場合は調べて、自分なりに解釈した結果を述べてください。
オームの法則:電圧・電流・抵抗の関係を表す法則。電流と抵抗の積が電圧の値と一致する。
UART:Universal Asynchronous Receiver / Transmitter。デバイス間の通信に用いられるプロトコル。通信開始時にスタートビット、通信終了時にストップビットと呼ばれるデータを送信するという非同期的(調 歩同期式と呼ばれる)な通信を行う。また、誤り検出にパリティビットが含まれることもある。
SPI (Serial Peripheral Interface):クロック同期なシリアルインターフェースの一種。ICチップ等のデバイス間での通信に用いられる。パラレルインターフェースによる通信より低速だが、回路・端子・配線などが少なく、簡単かつ低コストで実装できるという特徴がある。
SDR (ソフトウェア無線):Software-Defined Radio。今までハードウェアとして実装されていた信号処理コンポーネントをソフトウェアとして実装することにより、ハードウェアに変更を加えずに無線通信方式を切り替えることが出来る通信技術。
問2
マイコンのファームウェアをデバッグするためには、どういう方法がありますか?
- ソースコードが公開されていたら、読む
- オシロスコープなどを用いて信号を観察
- シリアル通信等を通してログを出力する
(今気づいたんですけど、これ文字列長が揃ってますね)
問3
電気には直流と交流があります。同じ電圧のとき、どちらが感電したときに危険だと思いますか?その理由と一緒に説明して下さい。また感電はどんな工夫をすれば防げるでしょうか、思いつく限り多く挙げてください。
直感では向きが変わる交流のほうが危険だと思ったが、交流は正弦波であり、平均値でいえばそんなに高く無いのでは?
ここで検索し、Quoraにおける回答から このサイト を得る。「直流と交流とでは、感電の感触が異なる。直流は筋肉がギュッと硬直するのに対し、交流はザワザワと心臓の筋肉が震えるように痙攣する」「交流による感電の危険度は、直流に比べると4~6倍程度高く、50mAの交流電流に感電した場合は死亡する恐れがある。50mAの直流電流に感電した場合は、人体に苦痛を与えるが、感電個所から離れられなくなる程ではない」と書かれているから、「交流のほうが危険」というのが結論らしい。
感電を防ぐ方法:
- 絶縁体を身につける
- 触れると感電する箇所を露出させないようにする
- 必要ない時に電源を落とす
- 皮膚が濡れているときに作業を行わない(濡れていると抵抗が下がるため)
問4
このデータシートから、以下の情報を読み取ってください。 データシートURL: https://datasheets.raspberrypi.com/rp2040/rp2040-datasheet.pdf rp2040-product-brief.pdf (raspberrypi.com)
「GPIOに5.0Vを入力しようと思います。この機器は正常に動作しますか?」:5.2.3.4 IO Electrical Characteristics (P638) を読む限り、Input Voltage Highのmaximumが5Vを超えない(最大はIOVDD=3.3Vの時、MaximumはIOVDD+0.3だから3.6Vっぽい)ので正常に動作しない
「この機器でSPI通信は使用できますか?」:Chapter 1. Introduction (P9) においてKey Featuresとして2 SPI controllersが挙がっていること、4.4 SPI (P527) に “RP2040 has two identical SPI controllers”と書いてあること等から、使用できる
「IOVDDとDVDDの違いを説明してください」:IOVDD→2.9.1 Digital IO Supply (P179) より、”チップのデジタル入出力に供給される電源。公称電圧1.8~3.3V。必要となる信号レベルに応じてデジタルIOの外部信号レベルを設定する必要がある。全てのデジタルIOは共通の電源およびシグナルレベルで動作する”。DVDD→2.9.2 Digital Core Supply (DVDD) (P180) より、”コアデジタルロジックに供給される電源。公称電圧1.1V。専用のオンチップ電圧レギュレーターが備わっており、IOVDDやその他の1.8~3.3V電源からDVDDを生成することが出来る。オンチップレギュレーターとDVDD供給ピンとの間の接続はオフチップで、必要に応じてDVDDをオフチップ電源から供給することが出来る” 。
「SWDポートを使うと何ができますか?」:2.3.4 Debug (P61) より、SRAMもしくは外部フラッシュメモリへのファームウェアロード、実行/停止・ステップ・ブレークポイント設定・その他標準的なARMのデバッグ機能などによるプロセッサ実行の制御、プロセッサのアーキテクチャ的状態へのアクセス、システムバス経由でメモリ・メモリマップドIOへのアクセス等を行うことが出来る
「GPIO 1ポートから標準で何mA出力できますか?またGPIO合計で最大何mAまでの電流を出力できますか?(ただしQSPIポートで使用する電流は考慮しないものとします)」:Chapter 1. Introduction (P9) に「30 GPIO pins, 4 of which can be used as analogue inputs」 つまり1本あたりの電流 _ 30が後者の答えとなる 5.2.2.2 Pin List (P636) より、GPIO0-25はDigital IO (FT) , GPIO26-29はDigital IO / Analogue また、5.2.2.1 Pin Types (P635) より、Digital IO (FT) も Digital IO / Analogue もDefault Drive Strengthが4mA よって、1ポートあたり4mA、GPIO合計で4 _ 30 = 120mA
問5
家電もしくはIoT デバイスを分解したことはありますか。ある場合は分解した機器と、分解しようと思った思いを書いてください。(「ワクワクしたから」等が主となる理由でも問題ありません)
何を分解したかは詳しく覚えていませんが、「基盤を見たい」というモチベーションだけで、家にあったおもちゃ等を分解していました。内部構造について理解できたことはなかったです。
問6
機器内部の eeprom の吸い出しや、ファームウェアアップデータの解析等を行った経験はありますか。ある場合はどのような事を行ったか教えてください。(未経験でも問題ありません)
ありませんが、eepromの吸い出しはやってみたいことの一つです。
問7
何か他にアピールしたいことがあれば、自由に書いてください。書いておきたいことはなんでも書いてください。
そもそもこのコースに応募しようとしたきっかけとして、電子辞書でLinuxをブートさせるBrainuxというプロジェクトの存在があります。