|
一个程序在内存中通常分为程序段、数据段和堆栈三部分。程序段里放着程序的机器码和只读数据。数据段放的是程序中的静态数据。动态数据则通过堆栈来存放。在内存中,它们的位置是:
(图一)
当程序中发生函数调用时,计算机做如下操作:首先把参数压入堆栈;然后保存指令寄存器(IP)中的内容作为返回地址(RET);第三个放入堆栈的是基址寄存器(FP);然后把当前的栈指针(SP)拷贝到FP,做为新的基地址;最后为本地变量留出一定空间,把SP减去适当的数值。以下面程序为例:
example2.c
void func1(char * input) {
char buffer[16];
strcpy(buffer, input);
}
void main() {
char longstring[256];
int i;
for( i = 0; i < 255; i++)
longstring = 'B';
func1(longstring);
}
当调用函数func1()时,堆栈如下:
(图二)
不用说,程序执行的结果是"Segmentation fault (core dumped)"或类似的出错信息。因为从buffer开始的256个字节都将被* input的内容'B'覆盖,包括sfp, ret,甚至*input。'B'的16进值为0x41,所以函数的返回地址变成了0x41414141,这超出了程序的地址空间,所以出现段错误。
我对这段话
“当程序中发生函数调用时,计算机做如下操作:首先把参数压入堆栈;然后保存指令寄存器(IP)中的内容作为返回地址(RET);第三个放入堆栈的是基址寄存器(FP);然后把当前的栈指针(SP)拷贝到FP,做为新的基地址;最后为本地变量留出一定空间,把SP减去适当的数值。”
和这段话
“因为从buffer开始的256个字节都将被* input的内容'B'覆盖,包括sfp, ret,甚至*input。'B'的16进值为0x41,所以函数的返回地址变成了0x41414141”
看不懂。求教,谢谢。。
下面第一副图是图一,第二副是图二。 |
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有帐号?注册
x
|