缓冲区溢出校正请

时间:2010-12-17 15:18:21

标签: c buffer-overflow

我想在以下程序中避免缓冲区溢出漏洞,

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); 
} 

2 个答案:

答案 0 :(得分:1)

  fgets(str2, 8, STDIN);    

fgets有三个参数:

STR

  • 指向一组字符的指针 存储的字符串已存储。

NUM

  • 最大字符数 阅读(包括最后的 空字符)。通常,长度 使用str传递的数组的数量。

  • 指向FILE对象的指针 标识流在哪里 从中读取字符。阅读 从标准输入,stdin可以 用于此参数。

请参阅here

答案 1 :(得分:1)

我应该指出的第一件事是你的第一个实现有缓冲区溢出的原因。

// 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个字符。 fgets帮助我们解决这个问题。它需要一个参数,即要读取的最大字符数。有关fgets的详细信息,请查看弗拉基米尔的帖子。