c - 关于 strcpy 中的安全漏洞

标签 c strcpy

通过引起缓冲区溢出,我们可以覆盖保存标志值 0 的内存,因此即使是不正确的密码也会破解代码。

这将如何在内部发生?有人可以详细解释一下吗..这在内存中实际上是如何发生的?

#include<stdio.h>

int main(int argc, char *argv[])
{
int flag = 0;
char passwd[10];

memset(passwd,0,sizeof(passwd));

strcpy(passwd, argv[1]);

if(0 == strcmp("LinuxGeek", passwd))
{
    flag = 1;
}

if(flag)
{
    printf("\n Password cracked \n");
}
else
{
    printf("\n Incorrect passwd \n");

}
return 0;

最佳答案

请记住,从理论上讲,如果 passwd 中存储的字符串溢出,它会调用未定义的行为并且结果不可预测。

实际上,在许多局部变量存储在堆栈中的现代平台上,如果您的编译器将 flag 放置在 passwd 缓冲区之上,它可能是被 strcpy 调用溢出。

即您的堆栈可能如下所示:

| ...        |
+------------+
| flag       |  / \
+------------+   |
| passwd[10] |   | increasing addresses
| ...        |

如果您向 passwd 写入超过 10 个字节,strcpy 只会覆盖 flag

请注意,行为因编译器与编译器、平台与平台而异。此解释涵盖了常见系统上发生的情况,但要知道理论上可能存在不使用堆栈的平台,因此此解释不适用。

关于c - 关于 strcpy 中的安全漏洞,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21154786/

相关文章:

c - 如何从C/C++源代码文件中提取特定函数以进行后续处理

c - C 中结构的内存错误

在C中将较长的字符串复制为较短的字符串

c - 为什么 strcpy 上没有段错误?

复制结构体数组元素中的字符串

c++ - 与调用函数相比,goto 语句是否有效?

c - 在c中用strlen验证

c - 从文本文件中读取第一个单词,找出它的长度并计算文件中有多少个该长度的单词

来自文本文件的 C 字符串

c - 解释我的代码在做什么 (C)