我尝试使用以下代码触发缓冲区溢出,以便更好地了解漏洞。
我有某些字段,有些字段指定了宽度以试图防止溢出,但我在一种情况下 (firstName) 忽略了它以防止溢出:
char firstName[21], surName[31], job[16];
printf("Enter first name: ");
scanf("%s", firstName);
printf("Enter surname: ");
scanf("%30s", surName);
printf("Enter job name : ");
scanf("%15s", job);
所以现在当我输入以下内容时:
UmbertoTestingOverflow
Example
Janitor
记录的变量显示为:
UmbertoTestingOverfoExample
Example
Janitor
根据我对缓冲区溢出的理解,firstname 中的额外字符应该跑到另一个字段中,但在这种情况下,它从另一个变量中获取用户输入并将其添加到 first name 中。那么这是缓冲区溢出行为还是其他原因造成的?
最佳答案
是的,这是堆栈上的缓冲区溢出。
firstName
输入did 溢出到 surName
中。但是当您输入它时,您随后更改了 surName
,它用 Example
覆盖了字符。
因为 firstName
溢出了,字符串中没有空终止符,所以看起来 firstName
比实际长。然后它的“结尾”被覆盖(因为那些字节属于另一个变量)。
这实际上是未定义的行为。您不知道编译器会将您的缓冲区放在堆栈中的什么位置。
为了防止缓冲区溢出,您应该使用fgets
来读取字符串,而不是scanf
:
fgets( firstName, 21, stdin );
关于c - 当写入一个本地数组的字符出现在另一个本地数组中时,它是基于堆栈的缓冲区溢出的示例吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18885905/