課題6:バッファオーバーフローの実験
サンプルプログラム(2)を実行せよ.このプログラムはgets()関数を用いて,標準入力からの入力をバッファにデータを読み込むものであるが,結果を見ると,プログラム中で操作していないバッファdmy[]に値が入ることがある.この原因を考察し,解決策を示せ.また,この問題によって引き起こされるTCP/IP通信におけるセキュリティ上の欠陥はどのようなものが考えられるか,具体例を挙げて述べよ.


実行結果(修正前)

[nw0553:~/tcpip] j05053% ./a.out
before
buf(Len:0) =
dmy(Len:0) =
warning: this program uses gets(), which is unsafe.
3.141592653589793238462643383279502884197169399375105820974944592307816406286208
99862803482534211706798214808651328230664709384460955058223172535940812848111745
02841027019385211055596446229489549303819644288109756659334461284756482337867831
65271201909145648566923460348610454326648213393607260249141273
after
buf(Len:302) = 3.141592653589793238462643383279502884197169399375105820974944592
30781640628620899862803482534211706798214808651328230664709384460955058223172535
94081284811174502841027019385211055596446229489549303819644288109756659334461284
75648233786783165271201909145648566923460348610454326648213393607260249141273
dmy(Len:0) =
Segmentation fault



原因の考察と解決策

gets()関数は読み込むデータのサイズを指定できないため,バッファオーバーフローを起こしやすい. これを解決するために,gets()関数ではなく,データのサイズを指定する事のできるfgets()関数を用いる.


ソースプログラム(修正後)

#include

#define BUFLEN 200

int main(int argc, char **argv) {

char *rtn;
char dmy[BUFLEN];
char buf[BUFLEN];

memset(dmy, '\0', BUFLEN);
memset(buf, '\0', BUFLEN);

printf("before\n");

printf("buf(Len:%d) = %S\n", strlen(buf), buf);
printf("dmy(Len:%d) = %s\n", strlen(dmy), dmy);

if ((rtn = fgets(buf,BUFLEN,stdin)) == NULL) {
exit(-1);
}

printf("after\n");
printf("buf(Len:%d) = %s\n", strlen(buf), buf);
printf("dmy(Len:%d) = %s\n", strlen(dmy), dmy);

}



実行結果(修正後)

[nw0553:~/tcpip] j05053% ./a.out
before
buf(Len:0) =
dmy(Len:0) =
3.141592653589793238462643383279502884197169399375105820974944592307816406286208
99862803482534211706798214808651328230664709384460955058223172535940812848111745
02841027019385211055596446229489549303819644288109756659334461284756482337867831
65271201909145648566923460348610454326648213393607260249141273
after
buf(Len:199) = 3.141592653589793238462643383279502884197169399375105820974944592
30781640628620899862803482534211706798214808651328230664709384460955058223172535
940812848111745028410270193852110555964462294895493038
dmy(Len:0) =



戻る