一 点睛
C语言的强大和可怕之处在于其可以直接操作内存,C标准库中提供了大量这样的函数,比如strcpy、strncpy、memcpy、strcat等,这些函数有一个共同的特点就是需要设置源地址和目的地址,且src和dst指向地址不能发生重叠,否则结果将不可预期。
二 内存覆盖的例子
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
int main(){
char x[50];
int i;
for(i=0;i<50;i++)
x[i]=i+1;
strncpy(x+20,x,20);
strncpy(x+20,x,21);
strncpy(x,x+20,20);
strncpy(x,x+20,21);
x[39]='\0';
strcpy(x,x+20);
x[39]=39;
x[40]='\0';
strcpy(x,x+20);
return 0;
}
三 编译并运行
[root@localhost charpter05]# g++ -g 0512.cpp -o 0512
[root@localhost charpter05]# ./0512
四 用Valgrind检测内存覆盖
[root@localhost charpter05]# valgr