先看一段简单的小程序
#include <stdio.h>
#include <string.h>
char name[]="NEUQ_CSA";
int main()
{
char output[8];
strcpy(output,name);
for(int i=0;i<8&&output[i];i++)
printf("\\0x%x",output[i]);
return 0;
}
首先, #include<stdio.h> 和 #include<string.h> 是包含后面使用的strcpy函数和printf函数的头文件。
然后, char name[] = “NEUQ_CSA”; 是把‘name’这个数组赋值,往里面放入‘NEUQ_CSA’这几个字符。
然后是 int main(){ …… } ,这个是重点啦,这就是我们常说的主函数!程序进来就是先找到这个地方,执行里面的语句。
接下来的 char output[8]; strcpy(output, name); 就是让系统给output变量分配8个char的空间,然后把‘name’里面装的字符拷贝给它。
strcpy(des,source) 这个拷贝函数是把第二个参数source的值拷给第一个参数des。它不检查拷贝的长度,它会一直拷贝,直到source到结尾。这就是它的弱点!
下面的 for(int i=0;i<8&&output[i];i++) printf("\\0x%x",output[i]); 只

本文通过一个简单的C程序示例介绍了缓冲区溢出的概念,解释了strcpy函数的工作方式以及其潜在风险。当输出字符串长度超过分配的内存空间时,会导致堆栈中的EIP指针被覆盖,进而可能引发安全问题。堆栈是先进后出的数据结构,保存函数调用的相关信息,包括EBP和EIP。通过覆盖EIP,可以控制程序执行流程,这在恶意攻击中可能被利用。
最低0.47元/天 解锁文章
2778

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



