3

こんにちは私はCにまったく慣れていません。一言で言えば、クラスでの課題の一環として次のことを行っていました。

foo (char *var) {
  printf(var);
}

これは悪い習慣で安全ではないと言われましたが、私の家庭教師からこれに関する詳細な情報はあまり得られませんでした。varの文字列値がユーザーによって制御可能である場合、それを使用してバッファオーバーフローを実行できると思いますか?このコードを適切に強化するにはどうすればよいですか?strの長さなどを制限する必要がありますか?

乾杯&ありがとう!

4

4 に答える 4

6

次を使用する必要があります。

printf("%s", var);

代わりは。あなたのやり方で、私は入力%sとして入力することができprintf、印刷する文字列を探すときにランダムなメモリを読み取りました。これにより、予期しない動作が発生する可能性があります。

于 2013-01-21T10:42:17.157 に答える
6

フォーマット文字列攻撃につながる可能性があるため、これは安全ではありません

于 2013-01-21T10:45:32.457 に答える
0

さて、printfの最初の引数はフォーマット文字列です。したがって、関数の呼び出し元は次のように渡すことができます。

foo("%d")

次に、printfそこにない整数を探し、未定義の動作を引き起こします。考えられる修正の1つは、関数が呼び出すことです。

printf("%s", var);

これは(フォーマットではなく)通常の文字列としてprintf解釈されます。var

于 2013-01-21T10:43:22.490 に答える
0

Printfには次の署名があります。

int printf(
   const char *format [,
   argument]... 
);

ユーザーがフォーマット文字(たとえば%s)を入力すると、あらゆる種類の悪いことが起こります。

文字列を出力するだけの場合は、putsを使用します。

于 2013-01-21T10:44:02.697 に答える