1月5日(月)3コマ目
今日、やったこと
バッファオーバーフロー
今日のホワイトボード
この授業は
”セキュアプログラミング”と謳っているので、セキュリティ関係の話をします。
が、セキュリティは範囲が非常に広いため、プログラミングにまつわるセキュリティの話に限定。
さらに、インシデント件数の多いモノに限定。
![]() |
| 図 授業で扱う内容 |
基本的に、どんな言語を使っても、どんなモノを作るにしても、
- 知っておかなければならない
- やってはいけない
ことを話します。
バッファオーバーフローの演習の準備
バッファオーバーフローはC言語のプログラムで良く発生するので、C言語の演習環境(コンパイラ、デバッガ)のコンテナを用意した。
用意したコンテナには、Zドライブにアクセスできるように”mountZコマンド”を仕込んである。
![]() |
| 図 mountZコマンドでZドライブをマウント |
バッファオーバーフローとは
おそらく、全員一度は1年生のときにやらかしていると思われる。
以下のように、確保したメモリエリアを超えて書き込みを行った際に発生する。
![]() |
| 図 バッファオーバーフローが起きるプログラム |
運が良ければ何も起きないが、運が悪ければ”Segmentation Fault”や”Bus Address Error”が発生して、プログラムの実行が停まる。
"運が良ければ何も起きない"は中途半端なテストではエラーにならないため、一番恐ろしい。
コンピュータのメモリ
コンピュータのメモリはOSが管理している。
プログラム実行に関係するのは下図の3つのエリア。
エリアに仕切りがあるわけではない。場合によってはエリアを使い果たしてしまう可能性もある。(いまどきのコンピュータはメモリが豊富にあるためまず起きないと思うけど)
![]() |
| 図 メモリ上の3つのエリア |
C言語のif
C言語には論理型(bool型)がない。
ifやwhileなどは カッコ内が0か否か で分岐する。
![]() |
| 図 C言語とC#、Javaのifの違い |
[バッファオーバーフロー]サンプルプログラム1
サンプルプログラム"bof_sample1.c"をデバッガ上で、引数"1234567890"で実行し、check()関数実行後のメモリの様子を確認。
ローカル変数password_bufferは"0x7ff・・fea30"番地から16バイトのエリアを使う。
このエリアに、引数で渡された"1234567890"が格納されていることが分かる。
![]() |
| 図 ローカル変数password_bufferのエリア |
![]() |
| 図 2つのローカル変数のメモリ上の位置 |






