19

私はCで少し錆びていますが、この奇妙な問題に遭遇しました:

私はこのプログラムを書きました:

#include <stdio.h>

main()
{
  int n;
  n=1;
  while (n>0)
  {
    puts("Write a number: ");
    scanf(" %d",&n);
    printf("This is the number you wrote: %d\n", n);
  }

}

どうやら構文エラーはまったくなく、私が理解できる限り、コンパイルエラーもありませんでした。それは完全にコンパイルされ、ビルドされました。さて、この行を切り替えると:

puts("Write a number: ");

これで:

printf("Write a number: ");

エラーなしでコンパイルされますが、コンパイルされたオブジェクトが起動するとすぐに停止し、トロイの木馬を識別したことを示すウイルス対策警告が表示されます。結論を出す前に、私はそれを数回ビルドし、同じメッセージを受け取った後、virustotal.com でスキャンした結果がこれでした。

目的を考えると、 puts は実際には printf よりも正しいことはわかっていますが、それでも問題なく動作するはずです...

ここで何が問題なのですか?

AVG アンチウイルスと Pelles C を使用してコンパイルしています。

前もって感謝します。

4

3 に答える 3

6

明らかに誤検知です。生成されたマシン コードは、たまたまマルウェア データベースにあるコードに似ています。の使用とは関係ありませんputs()

于 2013-10-18T22:48:52.277 に答える
5

ウイルス対策ソフトウェアは、基本的にウイルス ソフトウェアが使用する実行可能コードの既知のパターンであるシグネチャに基づいて動作します。

野生のウイルスの中には、あなたが書いたコードのバージョンと同様のパターンを持っているものがprintfあります (あなたをウイルスとしてフラグ付けしたすべての人を検索しましたが、残念ながら、署名ファイルがチェックしているものを公開している人は誰もいません)。1 つの引数で呼び出してはならないため、printf多くのウイルス対策ソフトウェア プロバイダーが署名プロセスの一部としてそれを使用する可能性があります。

あなたが持っている2つのオプションは、単一の引数で呼び出さprintfない(とにかくすべきではない)か、プログラムがウイルスであると述べたウイルス対策ベンダーに誤検知としてプログラムを提出し、彼らは署名を更新して除外する可能性がありますあなたのプログラムを偽陽性として。

于 2013-10-18T22:50:33.897 に答える
1

printf() には、制御されていない書式文字列のセキュリティ リスクがあります

puts() を使用する必要があります

これも見つけました:

C の printf() と puts() の違いは何ですか?のコメントを参照してください。

puts の代わりに printf を使用する場合の注意点: 文字列を出力するために決して printf(variable) を実行しないでください。puts(variable) または printf("%s', variable) を使用してください。可変フォーマット文字列の使用にはセキュリティ上のリスクがあります。攻撃者が変数を書き込むことができる場合、フォーマット文字列を使用してプログラムを攻撃できます。 – Zan Lynx Dec 1 2012 で 9:05

于 2013-10-18T22:35:16.770 に答える