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つのローカル変数、password_bufferとauth_flagの位置関係は下図のとおり。
図 2つのローカル変数のメモリ上の位置
2つのエリアに仕切りはなく、password_bufferの先頭から不注意な書き込みをすると、auth_flagのエリアを破壊できることが分かる。

次回は

バッファオーバーフローが発生したときのメモリを確認。









このブログの人気の投稿

1月13日(火)3コマ目

2月2日(月)4コマ目

2月10日(火)3コマ目