セキュリティ・キャンプ全国大会2021 応募課題

セキュリティ・キャンプ全国大会2021のリバースエンジニアリングゼミに参加することになりました。最初で最後の応募だったのでとてもうれしいです。
参加を目指す方への先行のポイントに「できるだけ多く」とあったのでたくさん書きました。ただ、結構間違ってる部分があると思います(特に(3)とか)。

(0)リバエンゼミ、IoTものづくりゼミのどちらの受講を希望しますか?Xトラックの2つのゼミを併願することもOKですが、その場合はどちらが優先かを明記してください。

第1希望: リバエンゼミ
第2希望: IoTものづくりゼミ

(1)以下の技術用語について解説してください。またどのようなところで使われているかも述べてください。わからない場合は調べて、自分なりに解釈した結果を述べてください。「オームの法則」「UART」「SPI(Serial Peripheral Interface)」「I2C(I-squared-C)」「ソフトウェア無線(SDR)」

  • オームの法則
    一定の長さと太さの一様な導体上の2点間に電位差Vがあるとき、この導体には電位が高い点から低い点に向かって電流が流れる。このときに流れる電流Iは、2点間の電位差Vに比例し、V = RIの関係が成立する。比例定数Rは抵抗で、2点間の長さに比例し、導体の断面積に反比例する。また、導体内の微小領域において、電流密度の大きさをi、電位差によって生じる電場の大きさをEとすると、i = σEの関係が成立する。これは、導体内のすべての点で成り立つため、一様でない導体であっても足し合わせることでその導体の抵抗が定まる。
    電子論によってオームの法則を導く。電子の質量をm、その電荷をeとする。この電子は、導体内に分布する電場Eの作用により加速する。導体内で運動している電子は、導体を構成している電子や不純物と衝突し減速する。この衝突回数は電子の速度vに比例する。したがって、ある衝突から次の衝突までの平均時間をτとすると、導体内での運動方程式は m(dv/dt) = eE - (m/τ)vで表される。電子の動きが定常的になるとき、dv/dt = 0となるから v = (eτ/m)Eとなる。ここで導体の単位体積中に存在する自由電子の数をnとすると、単位時間に単位面積の断面を通過する電気量はenvであるから、電流密度iは i = env = (ne2τ/m)Eとなる。σ = ne2τ/mとおくと、i = σEが導かれる。σが電場の強さによらず一定であるため、オームの法則は金属と合金ではよく成り立つ。 ほとんどの電気回路で使われている法則である。

参考文献
砂川重信 (2019) 『電磁気学 -初めて学ぶ人のために-』 培風館
原康夫 (2019) 『物理学基礎』 学術図書出版社

  • UART
    Universal Asynchronous Receiver/Transmitterの頭文字で、速度を設定でき、非同期なシリアル通信を使用する、2つのデバイス間の通信プロトコルである。双方向の通信をする場合、送信機と受信機の間の2本のワイヤを使用して、ビット単位でデータを送受信する。通信方式には、一方向のみにデータを伝送する単向通信、双方向で通信できるが送受信を同時に行えない半二重通信、送受信を同時に行える全二重通信の3つがある。各デバイスには信号をやり取りするトランスミッタ(TX)とレシーバー(RX)がある。2つのデバイス間で通信するとき、送信側のデバイスにはデータを送信するデータバスが接続される。送信側のデータがワイヤを介して受信側のデバイスにビットごとに送信される(TX -> RX)。受信側のデバイスは、データを変換してデータバスに渡す。このとき、2つのデバイスでボーレートといわれる情報を転送する速度を同じ値にする必要がある。データの伝送はパケット方式で行われる。パケットは開始ビット、データフレーム、パリティビット、停止ビットからなる。データの転送を開始する際に送信側の開始ビットをハイからローに遷移させることで、受信側がそれを検出しデータフレームの読み出しが開始される。データフレームは開始ビットの直後に続き、パリティビットを使用する場合は最大9ビット、使用しない場合は5~8ビット使用される。パリティビットはデータフレームの直後の1ビットを使用してエラーを検出するために用いられる。これには、フレーム内の1の総数を偶数にする偶数パリティと奇数にする奇数パリティがある。停止ビットは1~2ビットを使用して、パケットの終わりを知らせる。
    CPUと周辺機器との通信の際に用いられ、主にコンピュータ機器、組み込みシステム、マイクロコントローラで活用されている。また、ルータなどの基盤にUARTの接続口があると未認証でシェルにアクセスできる可能性が高く、設定したパスワードなどのデバッグ情報が漏洩することがある。

参考文献
https://www.analog.com/jp/analog-dialogue/articles/uart-a-hardware-communication-protocol.html
https://www.rohde-schwarz.com/jp/products/test-and-measurement/oscilloscopes/educational-content/understanding-uart_254524.html
黒林檎、村島正浩 (2018) 『ハッカーの教科書 IoTハッキングの教科書』 データハウス

  • SPI
    Serial Peripheral Interfaceの頭文字で、コンピュータ内の通信に用いられるインターフェースの1つである。デバイスにはマスタとスレーブがあり、1つのマスタに対して複数のスレーブを接続することが出来る。一般的にはクロック(SPICLK)、チップ・セレクト(CS)、マスタ出力/スレーブ入力(MOSI)、マスタ入力/スレーブ出力(MISO)の4本の信号線で構成されている。クロック信号を生成する方をマスタと呼び、マスタとスレーブの間で送信されるデータは、クロックと同期している。100MHz程の高いクロック周波数に対応し、高速で通信することができる。マスタからのチップ・セレクト信号はスレーブの選択に使用され、スレーブを切り離したい場合はハイにする。複数のスレーブを接続するには各スレーブに対して個別のチップ・セレクト信号を送信する必要がある。通信を開始するには、マスタからクロック信号を送信するとともに、チップ・セレクト信号によりスレーブを選択する。マスタとスレーブはMOSIとMISOによって、シリアルにデータをシフトさせて出力することとデータを読み出すことを同時に行うことが出来る。また、マスタはクロックの極性と位相を選択できる。アイドル状態におけるクロック信号の極性を設定するCPOLビットとクロック信号の位相を選択するCPHAビットがあり、これらの組み合わせによりモードが決まる。スレーブに適合するように設定する必要がある。 コンピュータ内のマイクロコントローラ間の通信やフラッシュメモリなどで使われている。

参考文献
https://www.analog.com/jp/analog-dialogue/articles/introduction-to-spi-interface.html
https://learn.sparkfun.com/tutorials/serial-peripheral-interface-spi/all
https://manual.atmark-techno.com/armadillo-guide-std/armadillo-guide-std-hardware-expansion_ja-1.0.0/ch06.html

  • I2C
    Inter-Integrated Circuitの略で、オランダのフィリップス社が提唱したコンピュータ内やコンピュータ間の通信に用いられるインターフェースの1つである。デバイスにはマスタとスレーブがあり、1つのマスタに対して複数のスレーブを接続することができる。シリアルデータ(SDA)通信とシリアルクロック(SCL)信号の2つの信号を使う。マスタがシリアルクロック信号を生成し、この信号に同期してシリアルデータ信号でマスタとスレーブが双方向に通信を行う。スレーブには固有のアドレスが割り振られ、マスタがそのアドレスを指定してスレーブと通信を行う。最大3.4Mbpsで通信することができる。通信には、アドレスフォーマットとデータフォーマットがあり、アドレスフォーマットには7ビットモードと10ビットモードがある。7ビットモードの場合、通信を始めるときマスタはスレーブに対して、SCL信号がHighのときにSDA信号をHighからLowにすることでスタートコンディションを発行し、スレーブアドレスとRead/Writeコマンドを送信する。スレーブはそのアドレスが自分のものと一致するかを調べ、一致しない場合は待機状態になり、一致した場合はRead/Writeコマンドに従ってマスタとやりとりする。Readの場合、スレーブはACKを返した後に続けてマスタにデータを送信し、マスタはデータを受信した後にNAKを返す。Writeの場合は、スレーブがACKを返した後にマスタはデータを送信し、データを受信した後にスレーブはACKかNAKを返す。最後にマスタがスレーブに対して、SCL信号がHighのときにSDA信号をLowからHighにすることでストップコンディションを発行し、スレーブは待機状態になって通信が終了する。
    I2Cは低消費電力で通信できるため、様々なセンサや集積回路、マイクロコントローラに用いられている。

参考文献
https://www.digikey.jp/ja/articles/why-the-inter-integrated-circuit-bus-makes-connecting-ics-so-easy
https://www.kumikomi-kaihatu.com/technical-column/column-018/
https://emb.macnica.co.jp/articles/8191/
http://www.picfun.com/c15.html

  • ソフトウェア無線 (SDR)
    Software Defined Radioの略で、無線通信システムの機能をソフトウェアによるデジタル信号処理でハードウェアを変更せずに複数のシステムに対応できるようにすることである。一般的にソフトウェア無線機は、アナログ高周波部、変換部(A/D、D/A)、デジタル信号処理部から構成される。アナログ高周波部は、アナログの高周波(RF)信号を扱う部分である。受信側では受信したRF信号を周波数変換によってデジタル信号処理ができるベースバンド受信信号に変換する。送信側ではベースバンド送信信号を周波数変換してRF信号を送信する。変換部の受信側ではアナログのベースバンド受信信号をデジタルのベースバンド信号に変換(A/D)し、送信側ではデジタルのベースバンド信号をアナログのベースバンド送信信号に変換(D/A)する。デジタル信号処理部は、デジタルのベースバンド信号を処理する。デジタル変復調、符号化・復号化などの機能を持たせることができる。この機能をソフトウェアで柔軟に変更できるように、ハードウェアにはFPGADSPのような再構成できるものを用いる。以前は無線機を作るために専用のハードウェアや多くの工数とコストが必要だったが、ソフトウェア無線を用いることで手軽に開発できるようになり、コストを抑えられるようになった。
    SDRは、FMラジオ、テレビ、衛星通信、LTEなどのデジタル無線通信、GPSなど様々な分野で応用されている。

参考文献
https://jp.mathworks.com/discovery/sdr.html
https://www.fujitsu.com/jp/group/mtc/technology/course/sdr/
https://www.ituaj.jp/wp-content/uploads/2017/11/2017_11-05-Spot-SDR.pdf

(2)電気には直流と交流があります。どちらが感電したときに危険だと思いますか?その理由と一緒に説明して下さい。また感電はどんな工夫をすれば防げるでしょうか、思いつく限り多く挙げてください。

直流は常に一定の電圧で一定の向きに電流が流れます。一方交流は一定の周期で電圧と電流の向きが変化します。また、人の心臓は規則的に収縮して全身に血液を送り出しています。直流に感電した場合は筋肉が収縮します。交流に感電した場合は周期的な変化により心臓の収縮のリズムが崩れて全身に血液が送られなくなります。血液が送られなくなると呼吸が出来なくなったり、脳が機能しなくなり意識がなくなります。よって、交流の方が直流よりも危険だと思います。
以下のような対策が考えられます。

  • 濡れた状態で触らない
    感電したときの電流の大きさはオームの法則により電圧/抵抗で求められます。濡れた状態で触ることで抵抗が小さくなり流れる電流が大きくなります。
  • 電流が流れる部分をむき出しにしない
    電流が流れる部分を直接触れないように、被覆するべきです。
  • 壊れたものは使わない
    壊れた部分から漏電する可能性があります。
  • 接地する
    接地することで電流を地面に逃がすことができます。
  • 漏電ブレーカー
    漏電を検知することで感電を防ぎます。
  • ゴム製のものを身につける
    ゴムは電気を通しません。
  • 作業するときは肌を露出しないようにする
    電流が流れる部分を直接触れないようにします。

(3)このデータシートから、以下の情報を読み取ってください。

データシートURL:https://www.espressif.com/sites/default/files/documentation/esp32-wroom-32_datasheet_en.pdf

  • この機器は日本で使用できますか?(ヒント:技適
    番号211-161007で技適が取得されているため、日本で使用できる。
  • 電源電圧と電源ピンのピン番号はそれぞれいくつですか?
    電源電圧: 3.0V~3.6V 電源ピン: 2
  • この機器でSPI通信は使用できますか?
    4MBのSPI flashがあるためできる。
  • この機器に搭載されている水晶振動子の発振周波数はいくつですか?
    40MHz
  • GPIO 1ポートから最大何mAまでの電流を出力できますか?
    1100mA
  • GPIOに5.0Vを入力しようと思います。この機器は正常に動作しますか?
    入力電圧の絶対最大定格は3.6Vであるため、正常に動作しない。

(4)IoT温度計を作りたいと考えています。あなたならどう作りますか。できるだけ具体的に説明してください。必要に応じて図などを使ってもOKです。説明の中に、あなたのこだわりポイントを入れて説明してください。

家にあった部品で実際に作ってみました。以下の部品とマイコンを使います。

  • Arduino UNO
  • LED 1つ
  • LCD 1602A
  • LM35DZ (温度センサ)

まず、図のような回路を組みます。

次にArduinoに以下のスケッチを書き込みます。

#include <LiquidCrystal.h>

LiquidCrystal lcd(4, 6, 10, 11, 12, 13);
const int SENSOR = 5;
const int LED = 2;

void setup() {
  Serial.begin(9600);
  pinMode(LED, OUTPUT);
  lcd.begin(16, 2);
}

void loop() {
  int val = analogRead(SENSOR);
  float temp = val * (5.0 / 1023.0) * 100;
  if(temp < 30) digitalWrite(LED, LOW);
  else digitalWrite(LED, HIGH);
  lcd.clear();
  lcd.setCursor(0, 0);
  lcd.print(temp);
  if(temp < 10.0) Serial.print(0);
  Serial.println(temp);
  delay(1000);
}

まず、setup()内でシリアル通信とLEDが繋がっているピンとLCDの設定をします。loop()内では、まず温度センサの値を読み取り適切な値に変換します。analogRead()は0から5Vの電圧を0から1023に対応させるため、スケッチのような変換が必要になります。変換した値が30よりも小さい場合はLEDをOFFに、大きい場合はONにするようにします。次にLCDとシリアルポートに変換した値を書き込みます。シリアルポートに書き込むとき、値が10よりも小さい場合は、文字数の関係で正確に表示されなくなるため、0を先に書き込んでおきます。
次にArduinoと繋ぐサーバ(PC)で以下のPythonプログラムを実行します。

from flask import *
import serial

app = Flask(__name__)
ser = serial.Serial('COM3', 9600)

@app.route('/')
def index():
    temp = ser.read(7).decode()[:-2]
    return render_template('index.html', temp = temp)

if __name__ == "__main__":
    app.run(host="0.0.0.0")

flaskというWebアプリケーションフレームワークを用いてWebサーバを立ち上げます。アクセスしたときにシリアルポートの値を読み取ってindex.htmlに渡します。templatesディレクトリ下に以下のようなindex.htmlを作成します。

<!DOCTYPE html>
<html>
    <body>
        {{ temp }}
    </body>
</html>

受け取った値を表示するだけです。
この温度計は、室内で使うことを想定していて、離れたところからはWebページで温度を確認でき、近くからはLCDに表示される値で確認することができます。こだわりポイントは、30℃以上になった場合は危険を知らせるためにLEDが点灯するところです。

(5)今までにリバースエンジニアリング(分解や解析など)した経験、またはものづくりした経験を好きなだけ語って下さい。対象はソフトウェアやハードウェアに限定しません。

  • Windowsのデバッガ
    32ビットのWindowsプログラム用のデバッガを作ったことがあります。普段使っているデバッガの動作原理が気になり、実際に作ってみることにしました。レジスタの値を表示する機能とブレークポイントを設定する機能をPythonで実装しました。以下で簡単に説明させて頂きます。
    まず、CreateProcessA()でデバッガの制御下でプロセスを生成するか、DebugActiveProcess()にプロセスのPIDを渡すことで実行中のプロセスにアタッチします。ループ中でWaitForDebugEvent()を呼び出すことでデバッグイベントを捕捉でき、イベントハンドラによる処理が完了したときContinueDebugEvent()によってプロセスの実行を再開します。WaitForDebugEvent()は、この関数に渡すDEBUG_EVENT構造体に情報を設定します。このDEBUG_EVENT構造体のdwDebugEventCodeによって共用体uの型と値が決まり、この値のそれぞれにイベントハンドラを設定します。最後にDebugActiveProcessStop()でデバッガからプロセスを切り離します。また、ほとんどの関数でプロセスのハンドルが必要になるためOpenProcess()にプロセスのPIDを渡して取得します。 レジスタの状態を捕捉するには、まずデバッグ対象のプロセス中で実行されているスレッドのハンドルが必要です。これは、OpenThread()にTIDを渡すことで取得できます。次にCreateToolhelp32Snapshot()でプロセスで実行中の全てのスレッドを取得し、Thread32First()とThread32Next()でそれらを列挙します。最後にGetThreadContext()で全レジスタの値を取得します。
    ソフトウェアブレークポイントは、1バイトの命令によってプロセスの実行を停止します。あるアドレスにブレークポイントを設定するとき、ReadProcessMemory()でそのアドレスのメモリの最初の1バイトを読み取ってリストに保存し、WriteProcessMemory()で割り込み3の命令を表す1バイトに書き換えます。ブレークポイントに到達したとき、このアドレスがブレークポイントのリストに存在するかを確認し、存在する場合は保存してある1バイトを復元します。
    ハードウェアブレークポイントは、DR0からDR7の8つのデバッグレジスタを使用して設定します。DR0からDR3はブレークポイントのアドレスを保持し、DR6はブレークポイントに到達したときに引き起こされたデバッグイベントのタイプを決定し、DR7はブレークポイントの条件を保持します。CPUは命令を実行する前に、そのアドレスに対してハードウェアブレークポイントが設定されていないかを確認し、そのアドレスがDR0からDR3のいずれかに格納されていてDR7で設定された条件を満たす場合、割り込み1を引き起こし、CPUは実行を停止します。その後、各レジスタをクリアしCPUは次の命令を実行します。
    デバッガを作ることにより、プロセスの起動や中断の方法、ブレークポイントの仕組み、レジスタやメモリを操作する方法、プロセスで発生した例外を捕捉する方法などたくさんのことを知れてとても勉強になりました。今後はディスアセンブルの機能をつけたいと考えています。また、他のアーキテクチャのデバッガも作ってみたいです。

  • ELFファイル
    私は趣味でCTFに参加していてPwnと呼ばれるバイナリを解析して脆弱性を探し、脆弱性を使って攻略するという分野の問題をよく解いています。ELFファイルはPwnでよく出題されるため、今までたくさん解析してきました。主にGDB、objdump、Ghidra、readelfなどのツールを使い解析をします。特にGDBはよく使っていて、アセンブラを読んだり、プログラムによってどのようにメモリが使われるのかを解析してきました。Ghidraは主にデコンパイルするときに使っています。また、ELFファイルの解析を通して、プログラムの脆弱性について理解しました。例えば、リターンアドレスを書き換えることで任意のアドレスに処理を移すことができる原理や、mallocやfreeなどのlibcの関数の処理を悪用することによる攻撃の手法について理解しました。これに伴いNX、RELRO、Stack Canary、PIEなどのプログラムのセキュリティ機構についても理解しました。ここで先日開催されたSECCON Beginners 2021で実際に出題された問題を解いたときの手段、方法について紹介させて頂きます。
    beginners_rop
    以下のようなアセンブラのmain関数を持つプログラムが与えられます。

   0x0000000000401196 <+0>:     endbr64 
   0x000000000040119a <+4>:     push   rbp
   0x000000000040119b <+5>:     mov    rbp,rsp
   0x000000000040119e <+8>:     sub    rsp,0x100
   0x00000000004011a5 <+15>:    lea    rax,[rbp-0x100]
   0x00000000004011ac <+22>:    mov    rdi,rax
   0x00000000004011af <+25>:    call   0x401090 <gets@plt>
   0x00000000004011b4 <+30>:    lea    rax,[rbp-0x100]
   0x00000000004011bb <+37>:    mov    rdi,rax
   0x00000000004011be <+40>:    call   0x401070 <puts@plt>
   0x00000000004011c3 <+45>:    mov    eax,0x0
   0x00000000004011c8 <+50>:    leave  
   0x00000000004011c9 <+51>:    ret    

gets関数でスタックの領域に入力を書き込むことがわかります。gets関数は引数に書き込む領域だけを指定して、書き込むサイズは指定しません。書き込むサイズを指定しないと無限に入力ができることになります。今回の例で実際に無限に入力を行うとスタックにあった値を書き換えることになります。
関数が呼ばれるとき、関数の処理が終了したときに呼び出し元に戻れるようにリターンアドレスをスタックに書き込みます。このリターンアドレスを書き換えることで関数の処理が終了したときに任意のアドレスに処理を移動させることができます。今回の例ではrbp+0x8の位置にリターンアドレスがあります。GDBを使うことで以下のように確認できます。

gdb-peda$ x/gx $rbp+0x8
0x7fffffffde58: 0x00007ffff7df30b3
gdb-peda$ x/i 0x00007ffff7df30b3
   0x7ffff7df30b3 <__libc_start_main+243>:      mov    edi,eax

rbp+0x8にある値を表示し、その値は__libc_start_main+243のアドレスということがわかります。
ここではgets関数で0x108文字以上書き込むことでリターンアドレスが書き換えられることがわかります。このようにリターンアドレスを書き換えることで任意のアドレスに処理を移動させ、最終的にはシェルを起動させることができます。

  • Webアプリケーション

(6)あなたが今一番リバースエンジニアリング(分解して仕組みが知りたい)したいもの、またはものづくりしたいものを紹介して下さい。

ネットワークカメラをリバースエンジニアリングしてみたいです。理由は主に2つあります。1つ目は、ハードウェアのリバースエンジニアリングの経験がほとんどないからです。今までソフトウェアの解析ばかりやってきたので、ハードウェアを解析してみたいです。ハードウェアを解析することで、デバイスがどのような仕組みで動いてるか、ソフトウェアとどのように連携しているかなど様々なことを知れると考えています。2つ目は、ネットワークカメラの仕組みが気になったからです。どのようにカメラで撮影した映像や画像にネットワークからアクセスするのか、どのようにネットワークからカメラを操作するのか、どのように動作を検知するのか、どのように自動で追尾するのかなどに興味があります。
ネットワークカメラはネットワークからアクセスできるようにする必要があるため、Webサーバーが搭載されることが多いです。Webサーバーにアクセスすることで、ネットワークカメラの設定をしたり、ユーザーとパスワードを設定したりします。このWebページを解析することで、ネットワークからアクセスする仕組みや脆弱性がどのように悪用されるかなどを知れると思います。
バイスにはハードウェアを制御するファームウェアが内蔵されています。近年、このファームウェアを狙うサイバー攻撃が増えてきています。脆弱性を悪用することでファームウェアが改ざんされたり、ハードウェアが乗っ取られたりすることがあります。ファームウェアを解析することで、ネットワークカメラが動く仕組みやどのようにしてサイバー攻撃がされ、それをどのように防ぐのかを知れると思います。

(7)何か他にアピールしたいことがあれば、自由に書いてください。誤ったことを書いていても減点はしません。書いておきたいことはなんでも書いてください。

私は大学でデバイスや電子情報システムの基礎となる理論やシステムの開発に必要な基礎知識について学んでいます。今まで電磁気学、電気回路、信号処理などを履修してきました。
電気回路では、回路の解析方法や、オペアンプトランジスタなどの電子部品の特性などを学びました。回路の解析では、ラプラス変換微分方程式を用いた回路方程式の解き方、過渡現象、周波数応答などを学びました。シミュレーターを用いて電気回路の周波数解析、時間解析をしたことがあります。また、オペアンプを用いた反転増幅回路、非反転増幅回路や発振器、加算回路などの演算回路をシミュレーターで解析し、オペアンプの特性について理解しました。トランジスタについても同様に、エミッタ接地回路をシミュレーターで解析し、トランジスタの特性やトランジスタによってどのように入力が増幅されるのかを理解しました。
信号処理では、信号の変換や加工の仕方について学んでいます。フーリエ変換を用いた周波数解析の手法を理解しました。実際にDFT(離散フーリエ変換)のプログラムを実装し、デジタル信号をサンプリングしたことがあります。また、ハミング窓を実装したり、音声データで対数パワースペクトルを求めることによるスペクトル解析をしたことがあります。
今回応募した理由は主に2つあります。1つ目は、自身の技術力を向上させたいと思ったからです。セキュリティキャンプは、専門家や技術者の方から技術について教えて頂くことができる貴重な機会だと思っています。私は今まで独学でサイバーセキュリティを主に様々なことを学んできましたが、独学ゆえに偏った知識や未熟な点がまだ多くあると思っています。セキュリティキャンプを通して、新たな知識やものの見方のようなものを得て、自身の技術力を向上させ、可能性を広げていきたいと考えています。2つ目は、ものがどのように動くのかに興味があるからです。私はコンピュータがどのように動くのか気になって、低レイヤと呼ばれるデバイスなどの基本的な制御を行うシステムプログラムの勉強し始めました。大学で現在の学科を選択した理由にもこのことが大きく関わっています。XトラックではIoT機器を分解、解析したり実際に作ったりできると伺いました。特にリバエンゼミでは無線通信の解析を行うと伺いました。今まで無線通信の解析をすることはあまりなかったので、とても興味があります。セキュリティキャンプはそういった自分が知らなかったことを知れるいい機会だとも思っています。解析やものづくりを通してデバイスが動く仕組みについて理解していきたいと考えています。

まとめ

(1)は知識がほとんどなかったので調べながら書きました。
(2)は感電について調べていたら「殺人の教科書」というサイトを見つけて怖かったです。
(3)は自信ないです。当たってるのかな🤔
(4)はラズパイを使いたかったのですが、手元になかったのでArduinoにしました。Web開発わからないのでWebアプリの実装は雑です。
(5)は「リバースエンジニアリング」という本を読んで実装したデバッガについて書きました。CTFの問題の解説はもっと書けたのですが、とても長くなりそうなのでやめておきました。
(6)は「IoTハッキングの教科書」という本を眺めて面白そうだと思ったものを選びました。
(7)の前半は、大学で最近やった実験についてです。レポートのストレスを少し発散しました。後半はポエムです。