-1

以下のプログラムでバッファオーバーフローの脆弱性を回避したいのですが、

int main (int argc, char *argv[ ]) {    
  int valid=FALSE;     
  char str1[8];     
  char str2[8];      
  next_tag(str1);     
  gets(str2);    
  if (strncmp(str1,str2,8)==0)      
    valid=TRUE;     
  printf("buffer: str1(%s),str2(%s),valid(%d) \n", str1, str2, valid); 
} 

これは、脆弱性を修正するための正しい修正ですか?

int main (int argc, char *argv[ ]) {     
  int valid=FALSE;     
  char str1[8];     
  char str2[8];      
  next_tag(str1);     
  fgets(str2);       /* HERE IS THE CHANGE! */
  if (strncmp(str1,str2,8)==0)        
    valid=TRUE;     
  printf("buffer: str1(%s),str2(%s),valid(%d) \n", str1, str2, valid); 
} 
4

2 に答える 2

2
  fgets(str2, 8, STDIN);    

fgetsは3つの引数を取ります:

str

  • 読み取られた文字列が格納されている文字の配列へのポインタ。

num

  • 読み取る最大文字数(最後のヌル文字を含む)。通常、strとして渡される配列の長さが使用されます。

ストリーム

  • 文字が読み取られるストリームを識別するFILEオブジェクトへのポインター。標準入力から読み取るために、stdinをこのパラメーターに使用できます。

ここを参照してください。

于 2010-12-17T15:23:09.607 に答える
2

最初に指摘する必要があるのは、最初の実装にバッファオーバーフローがある理由です。

// Allocate a char array that can hold 'max' 8 characters.
char str2[8];

// Ask user for input and stuff it into str2. If the user
// gives us more than 8 characters, we will end up overwriting
// str2 beyond its allocated buffer. 
gets(str2);  

したがって、必要なのは、 8文字以下を取得するように「gets」を指示する方法です。fgetsはこれを解決するのに役立ちます。パラメータ、つまり読み取る最大文字数が必要です。fgetsの詳細については、Vladimirの投稿をご覧ください。

于 2010-12-17T15:38:56.007 に答える