2006/12/27

[C言語]バッファオーバーフローの練習

■今回のプログラム

長さ5のchar配列を作成。
gets()で標準入力。
printf()で標準出力。

■ソースファイル
#include <stdio.h>
#define NUM 5

int main(void)
{
//文字列バッファ宣言(長さは5)
char s[NUM];

printf("s address:%X¥n", &s);
printf("s length:%d¥n¥n", sizeof(s));
printf("input string:");
gets(s);//バッファのサイズを渡せないのでチェックのしようが無い
printf("%s¥n", s);
}
■実行結果
$ ./BOFTest
s address:BFFFFCBB
s length:5

warning: this program uses gets(), which is unsafe.
input string:fdsafdas
fdsafdas

親切にwarningが出てますが無視して大量入力。
宣言した領域をはみ出して書き込んでますね。
printf()も領域完全無視で読みにいってるみたいです。
fscanf()が嫌われてるのもこれが理由らしいです。
作るのは簡単(よりもたちが悪い)なだけに対策が難しいですね。

0 件のコメント: