アキラのITメモ:バッファオーバーフローの確認

IT関係、技術関係のメモです。

バッファオーバーフローの確認

以下は、gets()関数によるバッファオーバフローの簡単な実験用プログラムです。年末年始の帰省の折に電車内で暇だったのでパソコンを開いて適当に作ってました。もちろん人はそれほどいなかったので出来たのですが。ちなみに、バッファオーバーフローでリターンアドレスをうまく書き換えることができれば任意のコードを実行できるのですが、その辺りの話はまたいずれということにします。。ここでは簡単にバッファがオーバーフローするという点のみプログラムにより確認します。

バッファオーバーフローの確認です。以下のようなファイルを用意し、例えばbuffer.cというコードで保存します。

#include <stdio.h>

#define BUFSIZE 30

int main(void)
{
  char *rtn;
  char dummy[BUFSIZE];
  char buffer[BUFSIZE];

  memset(dummy, '\0', BUFSIZE);
  memset(buffer, '\0', BUFSIZE);

  if ((rtn = gets(buffer)) == NULL)
    exit(1);

  printf("buffer[length:%d]=%s\n", strlen(buffer), buffer);
  printf("dummy[length:%d]=%s\n", strlen(dummy), dummy);
}

このプログラムは単純に標準入力から読み込まれたデータをbufferというバッファにコピーしているだけです。このプログラムにはbufferという30Bytesのバッファ領域とdummyという30Bytesのバッファ領域があります。ただし、ご存知のようにgets()関数を使用しているため、脆弱性があります。例えば以下のような54Bytesのデータファイル (data.txt) を用意してみます。

this_is_a_test_file_for_experiment_of_buffer_overflow.

このデータファイルを上記のプログラムに読み込ませるとどうなるでしょう?以下は実行結果です。

[akira@server]$ gcc buffer.c
[akira@server]$ a.out < test.txt
buffer[length:54]=this_is_a_test_file_for_experiment_of_buffer_overflow.
dummy[length:22]=nt_of_buffer_overflow.

54バイトの文字がそのままbufferの領域にコピーされてしまい、30バイトしかないbufferの領域をオーバーフロー、dummyの領域にまでデータがコピーされてしまっていることが分かります。これがバッファオーバーフローの簡単な確認になります。この場合、もし、dummyという領域をプログラム中のほかの部分で参照しているとしたら、予期せぬ動作や不具合が起きる可能性があります。また、データサイズが大きくリターンアドレスの部分まで書き換えられてしまうとCPU内のプログラムカウンタが任意の値にセットされてしまうという可能性もあります。

特にC言語でプログラムをするときは、バッファオーバーフローが起きないように、バッファオーバフローを起こすような関数を使用することを避ける、入力される文字列のチェックをする、といったことが大切になります。この辺りの話としては、IPA ISEC セキュア・プログラミング講座のページが面白いです。

カテゴリ: C言語 投稿日: 2007年01月02日 00:19
Trackback URL: http://akira-site.net/cgi-bin/mt/mt-tb.cgi/410

コメント

コメントを投稿





カテゴリ「C言語」内の記事

サイト内検索

カテゴリ

最近のエントリ

関連商品

アバウト

Atom RSS
Powered by MT3.33-ja
合計:total
今日:today 昨日:yesterday