2017-02-18 3 views
0

私はCを使い始めましたが、私は奇妙な問題に遭遇しました。Cのプロンプトが上書きされています

このコードは大きなプログラムの一部ですが、問題はここにありますが、わかりません。

#include <stdio.h> 
#include <string.h> 
#define WORDSIZE 512 

int read_stdNum(const char prompt[], char store[], size_t n) { 
    char inHold[WORDSIZE]; 
    char process[10]; 
    int status = 0; 

    while (1) { 
     fprintf(stderr, "%s", prompt); 

     if(fgets(inHold, WORDSIZE, stdin) == NULL) { 
      return 0; 
     } 

     sscanf(inHold, "%s", process); 

     status = sscanf(process, "%s", store); 

     if (status > 0 && strlen(store) == n) { 
      return 1; 
     } else if (status == -1) { 
      continue; 
     } else { 
      continue; 
     } 
    } 
} 

int main(void) { 
    char arrow[] = "\n==> "; 
    char stdNum[10]; 

    printf("%s\n", "store_student called."); 

    fprintf(stderr, "%s", "\nEnter a student number (axxxxxxxx)\n"); 
    read_stdNum(arrow, stdNum, 9); 
    return 0; 
} 

プログラムは、ユーザーの入力を要求し、プログラムが追加の数字を切り捨てるため、ここでのテストですが、私は「a123456789101112131415」のようなものを入力すると、出力が正常に動作し、何も、ありませんが、その後、プロンプトが書かれ、プロンプトは次のようになります。

==> a123456789101112131415 
131415_ 

アンダースコアは入力可能なところです。 文字配列 'process'も9文字以上を格納しています。 私は同級生の何人かに尋ねました。また、彼のコンピュータでうまくいきました。 私はダムのために燃え盛りになるつもりだが、なぜこれが動作していないのかを知りたい。おかげさまで

+0

あなたが読んで文字列の長さとして '9'を通過し、あなたの入力に応じて '6 '文字のみを入力します。これは 'strlen(store)!= n'を意味します。今それについて数分間考えてみましょう。その後、デバッガでプログラムを実行し、実際に何が起きているのかを一行ずつ確認します。うまくいけば、それはあなたの問題が何であるかについての手がかりを与えるはずです。 –

+4

'sscanf'呼び出しがバッファをオーバーフローさせる可能性があります。 – interjay

答えて

1

scanf%s」持つ関数危険であり得るとhttps://cwe.mitre.org/data/definitions/120.html「CWE-120チェック、(それがいくつかの有用なデータを上書きし、文字列に割り当てられた領域よりも出力文字列に複数バイトを書き込むことができる)、バッファオーバーフローを作成する:バッファ入力(「クラシックバッファオーバーフロー」)」&例のサイズを確認せずにコピーが1

https://en.wikipedia.org/wiki/Scanf_format_string#Vulnerabilities

これは、長さのない%sプレースホルダの使用が指定子ことを意味します本質的に安全でなく、バ​​ッファオーバーフローに対して悪用可能です。

scanfのドキュメントが sフォーマットの使用状況に関するいくつかの要件がある

http://man7.org/linux/man-pages/man3/scanf.3.html

s 
      Matches a sequence of non-white-space characters; the next 
      pointer must be a pointer to the initial element of a 
      character array that is long enough to hold the input sequence 
      and the terminating null byte ('\0'), which is added 
      automatically. The input string stops at white space or at 
      the maximum field width, whichever occurs first. 

scanfのような機能のより安全な使用方法は、「最大値を使用することである(配列を十分な長さでなければなりません)ダイナミックメモリ割り当ての場合は%9sまたはmのようにフィールド幅を指定します。

strlenとあなたのチェックが遅すぎる、。それは読むために長さには制限がなかったので、sscanfはすでに文字列のオーバーフロー/上書きをしました)

+0

ありがとう、私はそれを考え出した! – 2f1

関連する問題