-1

我对 C 编码相当陌生,我有一个任务是在基本的 C 程序上运行 libFuzzer 以利用问题并修复它们。这是我的 C 程序(它需要一个字符串输入并将“&”更改为“&”,将“>”更改为“>”,将“<”更改为“<”):

char *checkString(char str[50]) {
  int i;
  char *newstr;
  newstr = (char *)malloc(200);
  for (i = 0; i < strlen(str); i++) {
    if (str[i] == '&') {
      const char *ch = "&amp";
      strncat(newstr, ch, 4);
    } else if (str[i] == '<') {
      const char *ch = "&lt";
      strncat(newstr, ch, 3);
    } else if (str[i] == '>') {
      const char *ch = "&gt";
      strncat(newstr, ch, 3);
    } else {
      const char ch = str[i];
      strncat(newstr, &ch, 1);
    }
  }
  return newstr;
}

这是来自 libFuzzer 的错误消息:

SUMMARY: AddressSanitizer: heap-buffer-overflow (/path/to/a.out+0x50dc14) in strncat

谁知道如何解决这个堆缓冲区溢出问题?谢谢!

4

1 回答 1

3

之后newstr = (char *)malloc(200);newstr尚未正确初始化,因此您不能调用strncat( newstr, ... ).
您可以解决这个问题,例如,通过调用strcpy( newstr, "" );aftermalloc()或替换whichmalloc(200)calloc(200,1)NUL 填充整个缓冲区。

此外,正如@stevesummit 所提到的,尽管有声明,但不能保证strlen(str) < 50. 因此,您不应分配固定数量的 200 个字符,而应分配strlen(str)*4 + 1 ...strlen(str)*5 + 1&&amp;

于 2021-10-06T11:59:07.677 回答