函数调用堆栈详解
当进程被加载到内存时,会被分成很多段
- 代码段:保存程序文本,指令指针EIP就是指向代码段,可读可执行不可写,如果发生写操作则会提示segmentation fault
- 数据段:保存初始化的全局变量和静态变量,可读可写不可执行
- BSS:未初始化的全局变量和静态变量
- 堆(Heap):动态分配内存,向地址增大的方向增长,可读可写可执行
- 栈(Stack):存放局部变量,函数参数,当前状态,函数调用信息等,向地址减小的方向增长,可读可写可执行
- 环境/参数段(environment/argumentssection):用来存储系统环境变量的一份复制文件,进程在运行时可能需要。例如,运行中的进程,可以通过环境变量来访问路径、shell 名称、主机名等信息。该节是可写的,因此在缓冲区溢出(buffer overflow)攻击中都可以使用该段
栈帧的基本结构:
下面以一段代码来进行详解函数调用栈的过程
int sum(int _a,int _b)
{
int c=0;
c=_a+_b;
return c;
}
int main()
{
int a=10;
int b=20;
ret=sum(a,b);
return 0;
}
从上面的流程图以后就是正常的sum函数执行传参然后函数操作的过程。就不过多赘述。