网络 电子商务 编程
程。
这里有一个直观的缓冲区溢出的小例子:
void function(char *str)
{
char buffer[16];
strcpy(buffer, str);
}
Void main()
{
int I;
char buffer[128];
for(I=0; I<127; I++)
buffer[I]=A;
buffer[127]=0;
function(buffer);
printf(―This is a test.\n‖);
}
在函数function中,将一个128字节长度的字符串拷贝到只有16字节长的局部缓冲区中。在使用strcpy()函数前,没有进行缓冲区边界检查,导致从buffer开始的256个字节都将被*str的内容A覆盖,包括堆栈指针和返回地址,甚至*str都将被A覆盖。
再看看堆栈的结构,由于栈式内存分配具有一条指令即可为子程序分配全部局部变量的存储空间的特点,分配和去配的开销极低,高级语言通常在堆栈上分配局部存储空间。同时,堆栈也被用来存放子程序的返回地址。对C语言来说,调用函数的语句f(arg1,arg2,…,argn)被翻译为如下指令:
push argn
…….
push arg1
push n
call f
而函数的入口则翻译为如下入口指令(在Intel X86上)
pushl ebp
mov esp,ebp
sub esp,m #m为f的局部变量的空间大小
1所示: