アキラの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 セキュア・プログラミング講座のページが面白いです。
Trackback URL: http://akira-site.net/cgi-bin/mt/mt-tb.cgi/410
コメント
コメントを投稿
カテゴリ「C言語」内の記事
サイト内検索
カテゴリ
- Linux
- Linux Tips [14]
- Linux ソフトウェア [3]
- Web技術
- (X)HTML/CSS [4]
- JavaScript [1]
- MovableType [7]
- その他 [3]
- 各種API [3]
- 各種ツール [4]
- Windows
- Win Tips [3]
- Win ソフトウェア [6]
- コネタ [7]
- プログラミング
- 機器 [4]