我们先来看下面的代码 (来源于"12个有趣的C语言问答"):
#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;
}
这段关于密码验证的代码简单明了,除却argv[1]为空(用户没有给出参数)可能导致的程序崩溃问题,还有一个致命缺陷。
读者可以尝试编译以上代码并运行。当然,在参数为LinuxGeek时,控制台会正常输出显示密码正确;但是,问题出在参数的位数大于10的情况。
xp对此疑惑不解(直接说不懂C语言就好了嘛!),于是浏览此贴评论

本文通过分析一个C语言代码示例解释了栈溢出现象,当输入数据超过缓冲区大小时,会覆盖栈上其他数据,如flag变量。栈攻击是利用这种溢出来访问或修改内存的恶意攻击方式,常见于C/C++中,因为它们允许栈上的数据执行和越界读取。防御栈攻击的方法包括限制程序权限、动态检查数组长度和使用硬件支持的内存保护。
最低0.47元/天 解锁文章
1143

被折叠的 条评论
为什么被折叠?



