皆さんこんにちは、Jinです。
本日は久しぶりに告知をさせていただきます。
セキュリティキャンプ2022全国大会において、選考を通過し、参加することになりました!!
そこで今回は告知と共に、セキュリティキャンプについてと、応募課題を晒そうかと思います。
目次
セキュリティキャンプとは
「セキュリティ・キャンプ」は、学生に対して情報セキュリティに関する高度な技術教育を実施し、次代を担う情報セキュリティ人材を発掘・育成する事業です。参加するには応募課題を提出し、書類審査に通過する必要があります。ー公式HPより
全国大会や地方大会など様々な種類があるみたいで、私はこの内の全国大会に申し込みました。審査用に提出する応募課題は割と難易度の高い課題がいくつもありましたが、その達成感は非常に高かったです。
本来は4泊5日の合宿形式で行うキャンプ形式らしいですが、近年は新型コロナウイルス感染の影響によりオンライン形式で開催しています。
またセキュリティキャンプにはさまざまなコースがあります。今年度のコースは公式HPによりチェックしてみてください。私は開発コースのX1「リバースエンジニアリングゼミ」に参加します。
このコースを志望した理由としては、昔から分解が好きで一度専門的な分解の知識を付けてみたかったというのが大きいです。将来研究職志望で、研究と分解・改造がシステム的に近いものであったり、単純にIoT機器の分解をしてみたかったなど様々な理由からこのコースを選択しました。
また私が所属する同好会でも、様々な分解を行って改良したりした経験があったことから、このコースがやはり最適かなと思っています。X3のハードウェア魔改造ゼミも楽しそうで非常に悩みましたが、結局リバースエンジニアに応募してみました!!
応募課題
課題は全コース共通ではなく、コースごとで違った課題が出されています。今回は私が応募した、X1のリバースエンジニアリングゼミについてのみ紹介させていただきます。
X1リバースエンジニアリングゼミ課題
また非常に時間をかけじっくりと調べていますが、解答の正当性に関しましては保証致しませんのであらかじめご了承ください。
(5)~(7)に関しては残すのを忘れていたため、(1)~(4)のみの解答とさせていただきます。
1.以下の技術用語について解説してください。
オームの法則
電流や電圧には相関関係がある。これらを水に例えると、電流は水の勢いであり、一秒間にどれだけの水量が流れるかによって決定する。また電圧は水を流す圧力であり、これが大きいほど水は多く流れる。
このような性質から、電流と電圧は水流と水圧のように比例の関係にあることが分かる。
この時、電気の流しやすさ(水に例えると蛇口のようなもの)を表す比例定数をコンダクタンスgとして、この性質を示した実験式I=gV[A] がオームの法則である。
この実験式を定性的に説明すると、電流は電流を流す圧力である電圧と電流の流しやすさであるコンダクタンスに比例し単調増加する。即ち、コンダクタンスと電圧を決定するだけでその回路に流れる電流が決定するといった意である。
根本には電磁気学理論上の原理があるが、工学の世界ではよく水で説明されている。水で表すのはどうなのかという疑問はこう解決できる。電圧というのは電位というポテンシャルエネルギーの差であり、電磁場と重力場は場の理論で紐づいているため、これらの力学上の働きはほぼ同じである。
そのため、物質上の相違はあるが、水でとらえることは何ら違ったことではないのである。
参考文献:
・末松国弘著 基礎電気回路1
・渡辺久夫著 親切な物理 下
少し短すぎたかなとは思いますが、よくある例で電流を水に例えた解答にしています。「どのようなところで使われているか」も問われていたことは後から気づきました。そこまで書いていればもう少し字数があるかと思います。
コンダクタンスで記述していますが、一般に電気の世界ではオームの法則というくらいですので、抵抗値で書く方が理解しやすいかと思います。
しかし水で例えるなら蛇口とコンダクタンスを紐づけた方が理解しやすいと思い、こういった記述にしています。
UART
コンピュータ同士の通信方法には大まかに2種類あり、シリアル通信とパラレル通信というものがある。UARTとはこれら通信における送受信機であるため、まずはこれら通信について理解する必要がある。
シリアル通信とはSerialという単語の通り信号を直列に通信する方法であり、信号線一つで高速に通信できるため配線がシンプルになるのが利点である。
パラレル通信はこの逆で、信号を並列に通信をする方法である。パラレルでの通信はケーブルがデータ分必要になり、その間の様々な要因でデータの伝達速度にバラツキが出る可能性がある。そのため、シリアル通信の方が通信速度も速くなる。
UARTはパラレルをシリアルに変換して通信し、それを受信してまたパラレルに変換するといった通信方法である。この時に使用されるシリアル通信は非同期で、送信側と受信側でボーレートを予め設定しておく。
UARTではTxとRxという配線があり、それらをクロス結線で送信側と受信側で結び、通信をする。まさにUARTはシリアルとパラレルの各利点を生かした通信方法であると言える。
データの形式は最初にスタートビットを送りデータの開始を告げ、本体のデータビットを送信した後、エラー検出用にパリティビットで正常かどうかを確認しストップビットでデータを終了するといった流れになる。
参考文献:
https://contents.zaikostore.com/semiconductor/4816/
https://www.analog.com/jp/analog-dialogue/articles/uart-a-hardware-communication-protocol.html
https://synapse.kyoto/glossary/uart/page001.html
マイコンの開発をしていると身近に感じるUARTですが、詳しく調べてみる良い機会になりました。
シリアルやパラレルの信号というのはディジタル回路で出てくるような信号の種類ですが、これらの各利点を巧妙に生かしたUARTという技術には感動です。こういう先人たちの技術により、マイコンも今のように手軽に開発が出来るようになったのでしょう。
SPI
SPI通信は主に同じ基板上にあるICやディジタルセンサと通信するための通信方法である。
この通信は同期式のシリアル通信を用いており、SCLR(Serial Clock)、MISO(Master in Slave out)、MOSI(Master out Slave in)、SS(Slave Select)の4本の信号線からなる。SPI通信では通信側デバイスをマスターとスレーブに分けており、一つのマスターが複数のスレーブと通信する。
通信を開始するタイミングや通信をするスレーブは全てマスターが決定し、通信する相手のSSをLowにすることによって通信するスレーブを選択し、通信を開始する。
通信を開始すると、SCLKのエッジに同期してデータの転送が始まる。信号線の名前の通り、スレーブからマスターにデータを送る時はMISO、マスターからスレーブにデータを送る時はMOSIの信号線でMSBからLSBの順にデータが送られる。
データのビットはスレーブデバイスの仕様によって決定するため、マスターはそれに従ってデータを送受信する。またMISOとMOSIでデータの送信と受信をクロックに同期して同時に行うことができるのはSPI通信の特徴である。
加えてクロックの極性と位相によって4つの動作モードも定義されており、それぞれのデバイスに合わせた動作モードで通信する必要もある。
参考文献:
https://www.analog.com/jp/analog-dialogue/articles/introduction-to-spi-interface.html
https://synapse.kyoto/glossary/spi/page001.html
https://tonkun-tech.com/serial-uart-csi-i2c/
こちらはセンサやマイコン間での通信に使用するような通信方法であり、やはり身近な通信技術です。なかなか使用法は知っていてもその仕組みまで知るという機会はないのでいい機会になりました。
SDR
ソフトウェア無線機は、数々のディジタル技術の発達により生まれた最新の無線技術である。
ハードウェアに変更を加えることなく、制御側のソフトウェア部やFPGAのようなプログラマブルなハードウェア部を変更することによって多様な方式に対応できる無線通信システムである。
一般にアナログ高周波(RF)を扱う高周波部と変換部、ディジタル信号を処理する処理部によって構成される。
動作としては、受信側でアンテナより受信した高周波信号を周波数変換によりアナログベースバンド信号に変換し、変換部でA/D変換によりディジタルベースバンド信号に変換した後、処理部でこれを処理する。
処理部には無線システムの要となる機能を持たせ、ソフトウェアで柔軟に変更できるようにする。送信側ではこれの逆を行う。
こういったシステムを持つ単一のハードウェアによって、複数の機能に対応できるような無線システムがソフトウェア無線である。
参考文献:
https://www.fujitsu.com/jp/group/mtc/technology/course/sdr/
https://jp.mathworks.com/discovery/sdr.html
これについては初めて知る技術でした。もともとプログラマブルなICであるFPGAというものの存在については知っていましたが、こういったところで活かされているのだなぁと感心させられました。
2.マイコンのファームウェアをデバッグするためには、どういう方法がありますか?
内部にデバッグ機能を有するマイコンの場合は用意された機能を使用する方法が手っ取り早いが、そうでない場合マイコンのファームウェアをデバッグする一番単純なものは、実際のハードウェアを使って動作確認用の回路を構築し、様々な解析をかけることによりファームウェアの機能を確認する実験を行う方法である。
マイコンにおけるファームウェアは、レジスタについての記述をライブラリなどにまとめたものである。レジスタを直接記述するマイコンもあり、その場合はその記述部分を確認する。
デバッグというものはそのコードの処理を逐一知っておかなければバグの原因を探ることができない。それにはファームウェアの動作を解析することより始めなければならないが、マイコンはプログラムすればハードとして実際に動作するような装置なので、この解析をするにあたっては実際に回路を組んで動作を確認するのが最適なのである。
デバッグをするにあたってまず重要なのはレジスタについて知ることである。その規格はマイコンによってさまざまなため予め調べておき、以下の3つに注意して回路を組み、実験する。
1.配線に誤りのない正確な回路を組むこと。
2.記述に誤りのない正確なソースコードを組むこと。
3.適切な場所に表示関数や計器を挿入し可視化すること。レジスタの機能を確認しバグを発見するには、それ以外の箇所でバグがあってはいけないためである。
実際に回路を組み、回路側にはテスターやオシロスコープのような計器を挿入することで、またソフト側には値を表示する関数などを挿入するなどして動作を可視化すればデバッグが可能である。
参考文献:
https://depfields.com/firmware/
https://edn.itmedia.co.jp/edn/articles/1805/25/news022_5.html
この課題についてが一番苦労しました。マイコンにてデバッグした経験はかなりあるものの、ファームウェアという言葉を聞いたことしか存在を知らないものに大してどう解決すればよいのか、非常に悩みました。
そこで身近な生活に目を向けたときに、最初に出てきたのが「実験」でした。やはりこういったものとの紐付けにより、少ない知識を豊富な経験で課題解決をすることが重要なのではないでしょうか。
理論的な何かを解明し、考察を行うことが実験の主な目的になりますが、やはりこういうデバッグもそれと何ら変わりありません。そのためこういった方法を解説しています。
3.電気には直流と交流があります。同じ電圧のとき、どちらが感電したときに危険だと思いますか?
感電の危険性について、同電圧における危険度は交流の方が危険である。
感電した時、人間の生死を決める重要なパラメータは人体を流れる電流にある。しかし人体というものは様々な細胞が複雑に構成されているので、電線のように簡易的に考えることは危険である。
そこで細胞をその性質からキャパシタンスCと抵抗Rが並列に接続された、RC並列回路と呼ばれる回路に等価して置き換えることによってこれを考えやすくすることができる。
人体が単なる抵抗なのであれば交流も直流も流れる電流量は変わらず、危険度に関して明確な差は出ないが、これにキャパシタンス成分があるとすれば話が180度変わってくる。
なぜなら、直流においては極性が変化しないためキャパシタンス部分には電流は流れないが、極性の変化する交流においては極性が変化するタイミングでキャパシタンス成分の放電により電流量が増大するためである。
そのために交流の方が感電した時にキャパシタンス成分を含む枝に電流が流れるため総電流が増加し、直流と同じ電圧だと危険になると言うことができる。
漏電などにおいて感電を防ぐ工夫としてやはり一番重要なのはアース端子による接地である。人体を通る経路よりも負荷の少ないように大地とショートしている状態を作れば、電流はその経路を伝うためである。
これ故に雷などで感電せずに済む方法にもやはり金属のアクセサリーを身に付けるという方法がある。表面に金属をまとっていると、その金属を伝って電流が電位の低い地上に流れていくためである。
参考文献:
https://tohokuseigyo.net/tcs_column_all/tcs_column_haiden/%E9%85%8D%E9%9B%BB2/
http://www.eonet.ne.jp/~hidarite/ce/bussei02.html
こちらもなかなかの難易度の課題だと思いました。感電についていくらかの知識はありますが、やはりその原理上交流と直流の危険度の差を考えることが難しかったです。
しかし幸運なことに、私は神経科学も独学しており、その経験から人体という複雑な構造を電気振る舞い上等価な回路として取り扱うことによって、危険度の明確な差を説明することが出来ました。
この課題を解決するにあたって、”モデリング”という工学や理学において非常に重要な概念を体感しました。複雑な構造を単純な構造に置き換えて考えるという概念であり、今回の課題のように簡単に課題解決を可能にしてくれます。
4.このデータシートから、以下の情報を読み取ってください。
データシートURL:
https://datasheets.raspberrypi.com/rp2040/rp2040-datasheet.pdf
https://datasheets.raspberrypi.com/rp2040/rp2040-product-brief.pdf
GPIOに5.0Vを入力しようと思います。この機器は正常に動作しますか?
pp.639-640 に記されている通り、GPIO の入力電圧の定格値は IOVDD という IO の電圧を制御するピンによって左右するが、これの最大が 3.6Vであり、その場合の入力電圧の絶対最大定格は 3.6+0.3 より 3.9V となることが分かる。
よって 5.0V は GPIO の入力電圧の絶対最大定格値を上回るため、正常に動作しない。
この機器でSPI通信は使用できますか?
P.11のブロック図より、SPI通信は2ポート利用可能であることが分かる。また、各SPI通信機能が割り当てられているピンはpp.13-14に記されているGPIO Functionsの通りである。
IOVDDとDVDDの違いを説明してください
p.641より、IOVDDはGPIOなどの入出力ピンを制御する電圧なのに対し、DVDDはチップのクロックなどコアとなる部分に供給される電圧であることが分かる。
外部からレギュレータを介して落とした電圧をDVDDに供給するといった流れになる。
SWDポートを使うと何ができますか?
p.61より、SWDポートを使用するとファームウェアのロードやArmのプロセッサーに対する実行の制御、アーキテクチャの状態やメモリへのアクセスなど、ハードウェアとソフトウェアのデバッグ機能が可能になることが分かる。
GPIO 1ポートから標準で何mA出力できますか?またGPIO合計で最大何mAまでの電流を出力できますか?(ただしQSPIポートで使用する電流は考慮しないものとします)
GPIO1 ポートからの出力電流は、その GPIO ピンに繋ぐ回路により決定するが、それを制限 するレベルは p.264 より 2, 4, 8, 16mA の中からレジスタの設定で選択できる。
デフォルトで は p.324 より 4mA までの電流を出力できる。GPIO 全体で出力できる最大の電流は、 I_IOVDD_MAX で定められている通り、50mA を超えてはいけないことになっている。
こちらの設問については、データシートが英語で読み取りづらいことくらいで、日頃からデータシートを読む作業をしていればそこまで苦しい問題ではなかったです。
解答は読みやすくまとめており少し省きすぎている点があり、最後のQSPIポートに関しましては、QSPIポートに使用する電流の有無にかかわらずGPIO全体で50mAな故にこういった記述をしています。
さいごに
いかがでしたでしょうか。なかなか難しい課題に対し、一つ一つ冷静さとひらめきで解決していけばなかなか良い経験になりました。
長々と課題とそれに対する私の解答について解説しましたが、これからがキャンプの本番だと思いますので、頑張ってこようと思います!!
またキャンプを紹介していただいたあすぱらさんには感謝申し上げます。
それでは、今後ともどうぞよろしくお願い致します。GoodBye!!