通过引起缓冲区溢出,我们可以覆盖保存标志值 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/