C 字符指针溢出

C 字符指针溢出,c,C,我是C新手,我想知道指针是否可能被易受攻击的C函数(如strcpy()溢出)。我在源代码中见过很多,这是避免缓冲区溢出的一种方法吗?是的。这实际上是造成缓冲区溢出漏洞的典型原因。避免缓冲区溢出的唯一方法是确保不执行任何可能导致溢出的操作。在strcpy的情况下,解决方案是使用strncpy,其中包括要复制字符串的缓冲区的大小。当然,如果没有为缓冲区分配足够的空间,那么您当然可以: char* ptr = (char*)malloc(3); strcpy(ptr, "this is very, v

我是C新手,我想知道指针是否可能被易受攻击的C函数(如strcpy()溢出)。我在源代码中见过很多,这是避免缓冲区溢出的一种方法吗?

是的。这实际上是造成缓冲区溢出漏洞的典型原因。避免缓冲区溢出的唯一方法是确保不执行任何可能导致溢出的操作。在
strcpy
的情况下,解决方案是使用
strncpy
,其中包括要复制字符串的缓冲区的大小。

当然,如果没有为缓冲区分配足够的空间,那么您当然可以:

char* ptr = (char*)malloc(3);
strcpy(ptr, "this is very, very bad"); /* ptr only has 3 bytes allocated! */
然而,真正糟糕的是,这段代码可以在不给您任何错误的情况下工作,但它可能会覆盖某些内存,这可能会导致您的程序在以后爆炸,看起来是随机的,您可能不知道为什么。这些是数小时(有时甚至是数天)沮丧的根源,任何花大量时间写
C
的人都会告诉你


这就是为什么使用
C
,您必须非常小心处理这些事情,并对代码进行两次、三次、N度检查。之后,再检查一遍

还有其他一些方法

#define MAX_LENGTH_NAME 256

foo()
{
char a[MAX_LENGTH_NAME+1]; // You can also use malloc here

strncpy(a,"Foxy",MAX_LENGTH_NAME);

snprintf(a,MAX_LENGTH_NAME,"%s","Foxy");

}
因此,最好知道分配内存的大小,然后使用调用来避免缓冲区溢出。
对已经编写的代码进行静态分析可能会指出这些错误,您也可以对其进行更改

strncpy
没有多大帮助,因为如果目标中没有空间容纳终止的空字符,那么就不会在那里放置一个空字符(即,如果源大于目标大小)。有些人提供的值比实际目的地大小小。
strncpy
的API很容易出错,而且我多次看到它被错误地使用。我不知道为什么人们如此害怕计算缓冲区大小、分配一些内存和使用原始函数…@Thanatos:在这种情况下,当你从用户那里收到缓冲区时,你会怎么做?你甚至不能安全地调用strlen,它可能不是NUL终止的。@torak:当我从用户那里得到缓冲区时,它是NUL终止的。(毕竟……我是程序员,我写了程序?)如果不是,我知道其他形式的长度,比如aux
size\u t
。如果你有一个缓冲区,但你不知道缓冲区的长度,那么你已经在某个地方搞砸了。@Thantos:某些软件的作者身份不能让你控制它的输入。当然,您可以而且应该执行清理/验证检查,但这与控制用户输入不同。
strncpy()
调用仍然会导致未定义的行为,如果MAX\u LENGTH\u NAME为4(或者如果源字符串长度为256个字符),因为
数组的最后一个字节仍将处于未初始化状态。如果知道长度不会超过某个数字,则任何一个都必须这样做。否则,根据需要分配,即源的长度。当然,我们也可以使用函数asprintf,它负责空终止的额外字节。
snprintf
确保终止的空字符适合提供的缓冲区大小,但
strncpy
不适合。不是标准C,但可以使用strlcpy。确保始终包含nul。