ホーム » スタッフ » 斉藤徹 » 文字列の型と問題提起

2010年5月
« 4月   6月 »
 1
2345678
9101112131415
16171819202122
23242526272829
3031  

最近の投稿(電子情報)

アーカイブ

カテゴリー

文字列の型と問題提起

過去の資料を使いながら、文字列の取り扱いで見落としがちな問題点を説明する。 特に、未初期化ポインタのトラブルと、バッファオーバフローについて説明を行う。

void foo( char s[] ) {
:
}
void main() {
char s[ 20 ] ;
char *p ;
scanf( "%s" , s ) ;
foo( "1+2" ) ;   // たぶん正しい。
foo( 1+2 ) ;     // 文字と数式の区別がついていない
foo( '1+2' ) ;    // シングルクオートと、ダブルクオートの区別がついていない。
foo( s[ 100 ] ) ; // 配列サイズと添え字の区別がついていない人もいる。
foo( s ) ;  // たぶん正しい。(バッファオーバフローの可能性あり)
scanf( "%s" , p ) ; // 未初期化のポインタで入力
// (1) 多プロセスのメモリを触ってメモリエラー
// (2) 自プロセスの多データを触って、変な動き。
}

バッファオーバフローとセキュリティ

バッファオーバフローとして、下記のようなプログラムの危険性を解説。 s[]が局所変数であれば、付近には関数からの戻り番地(PC)が保存されている。 あふれる領域で、PCを書き換え、PCの飛び先をあふれる領域の中のプログラムに してやると、想定外のプログラムを実行できる。

char s[ 10 ] ;    // s[ | | | | | ] PC ウィルスプログラム
scanf( "%s" , s ) ;

C言語では配列の範囲外アクセスチェックは行われない。
(1)はみ出さないようにチェックする。
(2)まちがったプログラムは修正する。
(3)既存のソフトでも間違いがあれば、アップデートを行うこと。 特にWindows Update。ただし、通常Microsoftは1ヶ月毎のアップデートなので、 1月以内に作られたウィルスには効き目が無いかも。
(4)ウィルス対策ソフトを入れること。 ただしウィルスが発見されてワクチンやウィルス情報が作られるまでには数日かかる。 数日以内に作られたウィルスには効き目が無いかも。
(5)こういったバッファオーバフローなどの危険性を理解して、 不用意にプログラムを実行することの危険性を理解すること。