strncpy&使用非空终止字符串来读取堆栈帧

时间:2015-09-29 02:58:35

标签: c

我正在探索关于strncpy的C,因为大多数人都说它比strcpy更安全(附加参数,长度,以避免缓冲区溢出)。我还想找出非空终止字符串对程序的影响。这是我所拥有的代码片段。

char password[5]="1234\0"; //Global variable

int main(int argc, char* argv[])
{
  int length = 5;
  char temp[5];

  strncpy(temp, argv[1], length);     //Possible problems?

  /* Safer alternative */
  //strncpy(temp, argv[1], length-1);
  //temp[4] = '\0';

  if(strncmp(password, temp, length) == 0) {
    printf("Success! \n");
  }
  else {
    printf("Error! Password is incorrect: %s\n", temp);
  }

  return 0;
}

正如你所看到的,strncpy复制了5个字符,如果len(argv [1])> = 5,这将导致变量temp的非null终止。我想看看我是否可以使用它读取其他内存区域的属性,例如全局变量密码。

我已经读过strncpy有问题导致相邻缓冲区受到影响,如果字符串不是以空值终止的,导致下一个缓冲区在被引用时被读取。 探索相邻记忆:http://www.securiteam.com/securityreviews/5PP030KEUM.html

1 个答案:

答案 0 :(得分:2)

该行

printf("Error! Password is incorrect: %s\n", temp);
temp未终止时,

将成为问题。它将导致未定义的行为,因为格式%s需要一个以空字符结尾的字符串。

使用

strncpy(temp, argv[1], length-1);
temp[4] = '\0';

会导致错误的结果。如果用户提供以" 1234"。

开头的任何密码,测试将成功