yoshimi.'s Diary

よしみ.が過去にやってきたことに掃き溜めです

セキュリティキャンプ 応募課題晒しの回

選考通過したら晒すのが慣例みたいなので自分も晒します。(一部書き換えました。)

 次回の大会に参加したい人の参考になれば幸いですが、私はかなり弱いので、強い人のを多く見てください。

 

A.下記はフィジカルトラックが求めるキャンパー像ですが、これに対し自身の経験やSCに対する思いを述べてください。
・現時点での到達ではなくSC参加(我々が提供するコンテンツ)により伸びるであろう人材。
・活字等で得た知識に満足せず実際に自分の手を動かして物事の本質に迫ろうとする人。(物事の本質を見極めるまで途中で納得せず自分の手を止めない人。)
・SCで発掘あるいは評価しないと埋もれてしまいがちな特技の持ち主。
・SC修了後も自分の意志で継続的に課題に取り組む人。
・自分の得た知見を他の人と共有するための行動を起こす人。

 自分が今回、応募したきっかけは、今年の3月に行われたセキュリティ・ミニキャンプ in 福岡(以降ミニキャンプ) でワイヤータッピングについての講義を受けたことです。ミニキャンプ in 福岡に参加するまでは「セキュリティ」とはアプリケーション層やネットワーク層などに関係があり、自分が専門的に学んでいる物理層とはほとんど関係がないものだと考えていました。しかし、講義修了後には物理層も攻撃の標的になり得ることを知ることができました。また講義中に行ったハンズオンでは自分のグループはWiresharkで通信を傍受することができず、実験は上手く行きませんでした。最初はその場で自作したLANケーブルの不調だと考え、実験に成功していた他のグループに自分たちのLANケーブルを使用してもらいました。しかし、自分たちのLANケーブルを使っても他のグループは実験に成功していました。逆に自分たちのグループでは実験に成功していた他のグループのLANケーブルを使用しても上手くいきませんでした。次はグループ内で使用するパソコンの組み合わせを変えたりしましたが、それでも上手くいかず講義が終了しました。自分はどうにかして実験を成功させたかったので、一人で実験ができるように中古のノートパソコンを購入しました。その後、実験を成功させることはできたのですが、ミニキャンプ本番で上手く行かなかった原因が分かっていないので、今後は異なるOSのパソコンを用意するなどして原因を探っていきたいと思います。そして、この講義をきっかけに更に物理層におけるセキュリティについて深く学びたいと思いました。鹿児島や福岡及び九州ではアプリケーションやSQL、OSの勉強会はありますが、半導体や電子回路をメインとしたセキュリティに関するハンズオンの勉強会は見かけたことがなく、大学の授業でも学ぶことが出来ません。そのため、半導体や電子回路などの物理層を専門に勉強している自分にとっては今回のセキュリティ・キャンプのフィジカルトラックは数少ない機会なので、参加して多くのことを学びたいと思い応募しました。

自分はロボットや機械についての書籍を読んで書いてある機構をTAMIYAの工作キットで作っていました。自分が経験したのが、ロボットの設計で3DCAD上では問題が無かったが実際に部品を作って組み立てて動かしてみると、作成した機構が思ったように動かないことがありました。原因は部品の一つに想定を超える負荷がかかり、知らない間に部品が破損していました。このように3DCADなどの仮想空間では完璧であっても現実では簡単に上手くいかないことを学びました。また、電子工作の回路も実際に自分の手を使って回路を組むことでどのような部分でミスが起きやすいとか、間違えた回路を組むことで間違えたとき、なぜ、そのような動作をするのかを知ることで次に回路が同じ誤動作をした場合、どこを間違えているのかを推測しやすくなると考えています。これらのことは書籍には載っていないことが多いので実際に自分の手を動かすことは大事であると考えています。また後輩が制作した回路が想定してた動作をしないとの相談を受けることがあり、自分もかつて同じような不具合は発生したときにその不具合を解決したことがある場合は後輩にアドバイスができるので、そのようなときは書籍で得た知識だけでなく実際に手を動かさないと分からないこともあるということを感じています。

自分は初心者向けのCTFを行うほかに、大学でロボット研究会と図書館サポーターに所属して活動しています。ロボット研究会ではロボコンに向けてのロボット制作の他に自分はraspberry piやesp32などのマイコンを使用してIoT技術を学習しています。また、一緒にCTFなどに参加する先輩や、ミニキャンプで一緒のグループになった参加者などの話を聞いているとネットワーク層やアプリケーション層を専門的に勉強している人が多く、自分のように半導体や電子回路などの物理層を専門に勉強している人が少ないと感じました。そのため自分はセキュリティやアプリケーションのことを中心に勉強している人に比べて、プログラミングに関する技術は高くありません。しかし、自分はロボットや自作IoT機器に必要な電源やセンサの回路も回路シミュレーターでシミュレーションしてブレッドボードで試験したり後は、プリント基板のデータを制作、発注して実装できることは自分の特技の一つだと思います。ネットや書籍では回路やプログラムのことについては書かれていても、セキュリティ面の脆弱性のことまで書かれている文献はあまり見かけないのでセキュリティ・キャンプではIoTのセキュリティ面についても深く学びたいと思います。

SC修了後は自分の作ったロボットやIoT機器の性能や脆弱性を改善していきたいです。また、講義の一つにLSIFPGA、ARMマイコンを扱う講義もあるので学んだことは脆弱性の勉強だけではなくロボコンに向けても応用していきたいです。さらに、学んだ知識や実践経験を基に同じサークルの仲間と学んだことを共有していくと共に自分のブログで公開可能な範囲で学んだことを発信していきたいと思います。

 

B.以下の課題のうちひとつを選らび回答してください。総合的な回答ではなく、どの部分にフォーカスしたかを述べ, なるべくディープ回答を求めます。

B.1 作ってみたいCPUの仕様書を作成してください。特徴・用途、命令セットとそれに対応するビット列は必須とします。必ずしも現存する商用化されている汎用CPUにとらわる必要はありません。

B.2 LEDを点滅させるプログラムを示し、LEDが実際に点滅するまでの過程を解説してください。(私はこれを選択した。)

B.3 高級言語ではできないことについて解説してください。

B.4 C言語の関数longjmp setjmpを用いたプログラムを示し.それらを解説してください。

B.5 群論コンピュータサイエンスのかかわりについて思うところを述べて下さい。

B.6 LSIを製造できる装置が使えるとしらどのようなものを作りたいですか。装置の所有者を納得する提案書を作成してください。

B.7 サイバーセキュリティの分野で半導体機械語の知識が必要な理由を自分なりの言葉で述べて下さい。

 

 以下に今回、使用したプログラムを記述します。

#include <avr/io.h>            //各レジスタのビット名とビット番号の対応を定義

#include <util/delay.h>       //delay関数を使用可にする。
int main() {

 DDRD = 0b00000001;   //PD0を出力ポートに設定

 PORTD = 0b00000000; //PD0の初期値を0に設定

while(1) {       

 PORTD = 0b00000001; //点灯

 _delay_ms(1000);          //1秒待つ

 PORTD = 0b00000000; //消灯

 _delay_ms(1000);          //1秒待つ

  }

}

開発環境はAtmel Studio 7.0 を使用し、AVRライターmkⅡを用いてAVRマイコン(ATMEGA328p)にプログラムを書き込みました。また回路はマイコンの出力端子にLEDと抵抗(330Ω)を直列接続してLチカを行いました。今回はLチカのプログラムの各行における役割とそのときのマイコン内部の動作について説明します。

まず,AVR/io.hとutil/delay.hを読み込んでmain関数に入ります。ヘッダファイル<AVR/io.h>でAVRマイコンの各レジスタのビット名とビット番号(0~7)の対応を定義します。また、ヘッダファイル<util/delay.h>を読み込むことでdelay関数を使えるようにします。

次にポートD方向レジスタ DDRDのそれぞれのビットに0b00000001を書き込んで初期化し,各ビットの役割を確定させます。ポートD方向レジスタDDRDのそれぞれ0なら入力,1なら出力になります。今回はマイコンのPD0(2番ピン)を出力用、それ以外は入力用に設定しました。またPD0の出力状態の初期化します。ポートB出力レジスタPD0に0b00000000を書きこんで、初期値を0すなわちLEDを消灯状態にしました。0なら出力待機,1なら出力になります。なお0bとはC言語で2進数を表記するときの接頭語です。また一番右の桁はPD0に対応しており、右から2番目の桁はPD1、3番目のけたはPD2という様に対応していきます。

最後にwhile文の中で以下の内容を繰り返します。
マイコン内のプッシュプル回路に電圧をかけ,NchFETがON状態のとき出力はLOWとなりLEDは消灯します。
_delay_ms(x)はコンパレータの一方のレジスタにx[ms](xは数値)のデータを格納し,クロックカウント用のレジスタと比較し、一致したとき信号を出力します。今回はx=1000としました。1000[ms]経過するとプッシュプル回路に電圧がかかり,PchFETがON状態のとき出力はHIGHになりLEDは点灯します。その後1000[ms]経過すると再びLEDは消灯します。

 

とこんな感じです。課題Aは自分がミニキャンプに行って直接、今岡講師の講義を受けることができたこと及びロボ研で活動していたので比較的書きやすかったです。課題Bは過去にセキュキャンに行った2名の先輩方にアドバイスを頂きながら書きました。(本当にありがとうございました。)