系统栈与函数调用

原创 2015年11月21日 09:50:26

0x00 系统栈的工作原理

1) 进程使用的内存

  • 代码区:二进制机器代码
  • 数据区:全局变量等
  • 堆区:进程动态请求内存,用完归还。如动态分配和回收
  • 栈区:用于动态存储函数间调用关系,也叫系统栈、调用栈,由系统自动维护

2) 系统栈

int func_B(int arg_B1, int arg_B2)
{
    int var_B1, var_B2;
    var_B1=arg_B1+arg_B2;
    var_B2=arg_B1-arg_B2;
    return var_B1*var_B2;
}

int func_A(int arg_A1, int arg_A2)
{
    int var_A;
    var_A = func_B(arg_A1,arg_A2) + arg_A1 ;
    return var_A;
}

int main(int argc, char **argv, char **envp)
{
    int var_main;
    var_main=func_A(4,3);
    return var_main;
}
  • 程序中使用的缓冲区可以是堆区、栈区、存静态变量的数据区
  • 同一文件不同函数的代码在内存代码区的分布是散乱无关的
  • 程序执行中函数调用与系统栈的变化
    这里写图片描述
    这里写图片描述

3) 寄存器与函数栈帧

  • 当前运行函数的栈帧总在系统栈顶端
  • 当前栈帧(系统栈顶端)由ESP和EBP标识
    ESP:栈指针寄存器,存放着指向顶端栈帧的栈顶的指针
    EBP:基址指针寄存器,存放着指向顶端栈帧的底部的指针
    这里写图片描述
  • 函数栈帧包含
    局部变量:保存局部变量
    栈帧状态值:保存当前栈帧的顶部和底部
    函数返回地址:函数结束后返回到之前的代码区继续执行
  • 函数栈帧的大小不固定,与函数局部变量多少有关。函数运行过程中栈帧的大小也在变
  • EIP:指令寄存器,存着指向下一条等待执行指令的指针。

0x01 函数调用

1) 函数调用约定与相关指令

  • 函数调用约定:描述了函数参数传递方式和栈协同工作的技术细节。包括:
    a) 参数传递方式是寄存器还是压栈
    b) 栈传递时,参数压栈顺序
    c) 清栈由调用方还是被调方进行
  • 不同OS、语言、编译器的函数调用约定有差别
    这里写图片描述
    Visual C++6.0可支持3种函数约定,默认使用_cdecl调用方式
    这里写图片描述
    _fastcall方式在参数较少时通过寄存器传参:参数多时,前两个用寄存器传参,其余用压栈的方式传递
    这里写图片描述

2) 函数调用步骤

  • 参数入栈:参数从右向左依次压入栈中
  • 返回地址入栈:当前代码区调用指令的下一条指令地址压入栈,供函数返回是继续执行
  • 代码区跳转:CPU从当前代码区跳转到被调用函数的入口
  • 栈帧调整
    a) EBP入栈:保存当前栈帧状态值,以备后面恢复本栈帧时使用
    b) ESP—>EBP:更新栈帧底部,切换到新栈帧
    c) ESP – 新栈帧大小:抬高栈顶,给新栈帧分配空间
    这里写图片描述
  • OllyDbg中栈帧是按前栈帧EBP值划分的,返回地址成了栈帧顶部数据
    这里写图片描述
    这里写图片描述

3) 函数返回步骤

  • 保存返回值:函数返回值保存在EAX寄存器
  • 弹出当前栈帧,恢复上一个栈帧
    a) ESP + 当前栈帧大小:堆栈平衡基础上,降低栈顶,回收当前栈帧空间
    b) POP EBP:前栈帧EBP弹给EBP,恢复上一个栈帧
    c) POP EIP:函数返回地址弹给EIP
    这里写图片描述
    这里写图片描述
  • 跳转:按EIP的值返回母函数继续执行

4) 函数调用实现

  • 这里写图片描述

——《0day安全》学习笔记

版权声明:本文为博主原创文章,未经博主允许不得转载。

相关文章推荐

函数调用和系统栈

进程内存布局每个进程分配的内存由很多部分组成,通常称为“段”。 1.文本段:包含了进程运行的程序二进制机器语言指令,只读,可共享,因为多个进程可同时运行同一程序; 2.初始化数据段:包含显式初始化...

函数调用和系统栈的工作原理

这篇文章是摘录自《软件漏洞分析入门》,作者failwest,在此对作者表示感谢和膜拜,\(^o^)/~   根据不同的操作系统,一个进程可能被分配到不同的内存区域去执行。但是不管什么样的操作系统...

Linux开发系统函数调用

  • 2015年08月23日 15:50
  • 409KB
  • 下载

Linux+系统函数调用大全

  • 2009年09月22日 22:05
  • 1.34MB
  • 下载

ARM系统中函数调用过程中的参数传递

在嵌入式软件编程中,经常会用到函数调用,之前在学习如何在C语言中嵌入汇编时有了解到C语言之前的参数调用是使用寄存器R0传递第一个参数,R1传递到第二个..一直到R3传递第四个参数.但是实际上有时可能传...

Linux 系统函数调用大全

  • 2007年12月11日 12:49
  • 1.27MB
  • 下载

栈和函数调用-[软件调试].张银奎

  • 2012年05月30日 22:01
  • 3.71MB
  • 下载

Linux系统内核模块函数调用及命名空间

内核模块是怎么开始和结束的 用户程式通常从函数main()开始,执行一系列的指令并且当指令执行完成后结束程式。内核模块有一点不同。内核模块要么从函数init_module 或是你用宏modul...

php中使用exec,system等函数调用系统命令

php的内置函数exec,system都可以调用系统命令(shell命令),当然还有passthru,escapeshellcmd等函数。   在很多时候利用php的exec,system等函数调用...
  • lxzo123
  • lxzo123
  • 2011年08月03日 20:49
  • 627

phpcms系统类库与函数调用

学习 phpcms 菜鸟第一课:   ------------ 安 装 phpcms 和 后 台 访 问 管 理 ----------------------------...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:系统栈与函数调用
举报原因:
原因补充:

(最多只允许输入30个字)