如何解决 C 代码中的堆缓冲区溢出问题?
How can I solve heap-buffer-overflow in my C-code?
我对 C 编码相当陌生,我有一个任务,我们 运行 libFuzzer 在基本 C 程序上利用问题并修复它们。这是我的 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 = "&";
strncat(newstr, ch, 4);
} else if (str[i] == '<') {
const char *ch = "<";
strncat(newstr, ch, 3);
} else if (str[i] == '>') {
const char *ch = ">";
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
有人知道如何解决这个堆缓冲区溢出问题吗?谢谢!
在 newstr = (char *)malloc(200);
之后,newstr
尚未正确初始化,因此您不能调用 strncat( newstr, ... )
。
你可以解决这个问题,例如通过在 malloc()
之后调用 strcpy( newstr, "" );
或将 malloc(200)
替换为 calloc(200,1)
从而用 NUL 填充整个缓冲区。
此外,正如@stevesummit 所提到的,尽管有声明,但不能保证strlen(str) < 50
。因此,与其分配固定数量的 200 个字符,不如分配 strlen(str)*4 + 1
... 或者 strlen(str)*5 + 1
如果你正在做的是 HTML 逃避并且你意识到 &
应该被 &
取代
我对 C 编码相当陌生,我有一个任务,我们 运行 libFuzzer 在基本 C 程序上利用问题并修复它们。这是我的 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 = "&";
strncat(newstr, ch, 4);
} else if (str[i] == '<') {
const char *ch = "<";
strncat(newstr, ch, 3);
} else if (str[i] == '>') {
const char *ch = ">";
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
有人知道如何解决这个堆缓冲区溢出问题吗?谢谢!
在 newstr = (char *)malloc(200);
之后,newstr
尚未正确初始化,因此您不能调用 strncat( newstr, ... )
。
你可以解决这个问题,例如通过在 malloc()
之后调用 strcpy( newstr, "" );
或将 malloc(200)
替换为 calloc(200,1)
从而用 NUL 填充整个缓冲区。
此外,正如@stevesummit 所提到的,尽管有声明,但不能保证strlen(str) < 50
。因此,与其分配固定数量的 200 个字符,不如分配 strlen(str)*4 + 1
... 或者 strlen(str)*5 + 1
如果你正在做的是 HTML 逃避并且你意识到 &
应该被 &