« C言語の有効範囲(スコープ) | トップページ | クリスマス・イブ »

2007/12/23

バッファオーバーフロー

今日もC言語のメモです。なぜ、バッファオーバーフローかというと、私が受講している暗号理論の講義での話になります。

この講義の最初の課題では提出するプログラムの書き方に制限はありませんでした。ですが、2回目以降の課題では教官がプログラムの雛形を作ってきたのです。その雛形はscanfを一切使わず入力はコマンドライン引数のみ、というものでした。(出力にはファイル出力と標準エラー出力)

なぜ、このようなことをしたのかが私には疑問でしたが、全てはバッファオーバーフローでつながるのではないかと思ったわけです。

例えば、行単位の入力でfgets()という関数があります。プロトタイプは

#include <stdio.h>

char *fgets(char *buf, int size, FILE *stream);

です。これと類似した関数にgets()という関数があります。これのプロトタイプは

#include <stdio.h>

char *gets(char *buf);

見てのとおり、fgets()と違ってバッファサイズを示す引数がないので、gets()はバッファの範囲を超えて書き込む可能性があります。つまりgets()は本質的にバッファオーバーフローを防ぐことができません(有名な話ですが)。scanf()もgets()と同じように潜在的にバッファオーバーフローを起こす危険性があるわけです。

バッファーオーバーフローは運がよければOSの保護機構に引っかかるかもしれませんが、最悪の場合はエラーさえ起こらずにデータを破壊する可能性もあるようです。実際、世界初のインターネットワームはgets()のバッファオーバーフローを悪用していたようです。

確かに、このようなことを理解している人にとってはscanf()はなるべく使ってほしくないでしょうね。

|

« C言語の有効範囲(スコープ) | トップページ | クリスマス・イブ »

C」カテゴリの記事

コメント

この記事へのコメントは終了しました。

トラックバック


この記事へのトラックバック一覧です: バッファオーバーフロー:

« C言語の有効範囲(スコープ) | トップページ | クリスマス・イブ »