c - 当写入一个本地数组的字符出现在另一个本地数组中时,它是基于堆栈的缓冲区溢出的示例吗?

标签 c security buffer-overflow

我尝试使用以下代码触发缓冲区溢出,以便更好地了解漏洞。

我有某些字段,有些字段指定了宽度以试图防止溢出,但我在一种情况下 (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/

相关文章:

c - 在 C 中读取文件中的 double

php - 加密电子邮件、散列密码并将其存储在数据库中?

c - 缓冲区溢出漏洞: sh: 1: Syntax error: Unterminated quoted string : Developing exploit for personal enrichment

c - 我如何利用缓冲区溢出?

c - 返回 libc - 非法指令

c - 以下程序是否严格符合 C99 程序?

c - 在 C 中声明和分配具有文件作用域的变量

python - 正则表达式的安全性

c - 在 C 中释放双指针时出错

java - 让 SSL 适合本地主机