【操作系统】栈溢出-函数调用栈笔记

计算机程序的运行依赖于函数调用栈。栈溢出是指在栈内写入超出长度限制的数据,从而破坏程序运行甚至获得系统控制权的攻击手段。要实现栈溢出需要程序有向栈内写入的行为并且不限制数据输入的长度。这里记录第一部分-函数调用栈的基础笔记

函数调用栈

函数调用栈是指程序运行时一段连续的区域(程序的执行过程可看作连续的函数调用),用来保存函数运行时的状态信息,包括函数参数和局部变量等。发生函数调用时,调用函数的状态会保存在栈内,被调用函数的状态被压入调用栈的栈顶。在函数调用结束后,栈顶的函数状态被弹出,栈顶函数恢复到调用函数的状态。函数调用栈在内存中从高地址往低地址生长(栈的增长方向,是向低地址增长),所以栈顶对应的内存地址在压栈时变小,退栈时变大。
对于程序,编译器会对其分配一段内存。在逻辑上可分为代码段,数据段,堆,栈:


代码段: 用来保存文本,指令指针EIP就是指向代码段,可读可执行不可写


数据段:保存初始化的全局变量和静态变量,可读可写不可执行


BSS:未初始化的全局变量和静态变量


堆(Heap):动态分配内存,向地址增大的方向增长,可读可写可执行


栈(Stack):存放局部变量,函数参数,当前状态,函数调用信息等,向地址减小的方向增长,非常非常重要,可读可写可执行

posted @ 2020-07-24 22:15  Boky_Learn  阅读(413)  评论(0)    收藏  举报