栈帧

栈帧概念:

栈 我们通常指保存局部变量,具有先进后出 (FILO) 特性的一段高内存地址空间,维护这个 栈 结构而使用两个寄存器:栈指针 rsp 、帧指针 rbp.。在同一时刻,堆栈中会有多个函数的信息,每个未完成运行的函数占用一个独立连续区域(包含这个函数涉及的参数,局部变量,返回地址等相关信息),称为栈帧。当调用函数时,就要压入一个新的栈帧,发起调用函数的栈帧成为调用者栈帧,被调用函数的栈帧则称为当前栈帧。rsp 和 rbp 之间的内存空间就是当前栈帧。

rsp:永远指向栈顶
rbp:主要用于访问变量

栈分配的方向是从高地址向低地址分配,但在变量内部地址是从低地址向高地址增长,这给内存溢出攻击创造了条件

002B17F0  push        ebp  
002B17F1  mov         ebp,esp  
002B17F3  sub         esp,0E4h  
002B17F9  push        ebx  
002B17FA  push        esi  
002B17FB  push        edi  

第一步:将ebp压栈
第二步:将esp赋给ebp
第三步:是给esp减去0E4h的大小
接下来几步:分别将ebx,esi,edi压栈

函数调用分为以下几步:

参数入栈: 将参数按照调用约定(C 是从右向左)依次压入系统栈中;
返回地址入栈: 将当前代码区调用指令的下一条指令地址压入栈中,供函数返回时继续执行;
代码跳转: 处理器将代码区跳转到被调用函数的入口处;
栈帧调整:
1.将调用者的ebp压栈处理,保存指向栈底的ebp的地址(方便函数返回之后的现场恢复),此时esp指向新的栈顶位置; push ebp
2.将当前栈帧切换到新栈帧(将esp值装入ebp,更新栈帧底部), 这时ebp指向栈顶,而此时栈顶就是old ebp mov ebp, esp
3.给新栈帧分配空间 sub esp, XXX

函数返回分为以下几步:

保存被调用函数的返回值到 eax 寄存器中 mov eax, xxx
恢复 esp 同时回收局部变量空间 mov esp, ebp
将上一个栈帧底部位置恢复到 ebp pop ebp
弹出当前栈顶元素,从栈中取到返回地址,并跳转到该位置 ret

寄存器

寄存器是有限存贮容量的高速存贮部件,它们可用来暂存指令、数据bai和地址。
寄存器是CPU的组成部分,因为在CPU内,所以CPU对其读写速度是最快的,不需要IO传输。但同时也决定了此类寄存器数量非常有限,有限到几乎每个存储都有自己的名字du,而且有些还有多个名字。

寄存器的作用主要是:

可将寄存器内的数据执行算术及逻zhi辑运算
存于寄存器内的地址可用来指向内存的某个位置,即寻址
可以用来读写数据到电脑dao的周边设备

32位寄存器是以e开头的,主要包含下面一些寄存器:

a) 通用寄存器:EAX,EBX,ECX,EDX
b) 源变址目标变址寄存器:ESI,EDI
c) 栈相关积存器:SS,ESP(栈顶指针寄存器),EBP(栈基址寄存器)
d) 代码段寄存器,程序指令寄存器:CS,EIP(指令寄存器)
e) 数据段寄存器:DS(常与ESI寄存器结合使用)
f) 附加段寄存器:ES(常与EDI寄存器集合使用)
g) 控制寄存器:CR0-CR3。
CR0包括指示处理器工作方式的控制位,包含启用和禁止分页管理机制的控制位,包含控制浮点协处理器操作的控制位。CR1被保留,供今后开发的处理器使用。CR2及CR3由分页管理机制使用。CR2用于发生页异常时报告出错信息。当发生页异常时,处理器把引起页异常的线性地址保存在CR2中。操作系统中的页异常处理程序可以检查CR2的内容,从而查出线性地址空间中的哪一页引起本次异常。CR3 用于保存页目录表页面的物理地址,因此被称为PDBR。

h) 系统地址寄存器:GDTR(全局描述符表寄存器),LDTR(局部描述符表寄存器),IDTR(中断描述符表寄存器),TR(任务状态段寄存器)
i) Flag标志寄存器:
ZF 零标志,零标志ZF用来反映运算结果是否为0。如果运算结果为0,则其值为1,否则其值为0;AF 辅助进位标志,运算过程中第三位有进位值,置AF=1,否则,AF=0;
加法时,第3位向第4位(从第0位开始计)有进位;
减法时,第3位向第4位(从第0位开始计)有借位。有则该标志位就置1。通常用于对BCD算术运算结果的调整。
例:1101 1000+1010 1110=1 1000 0110其中AF=1,CF=1。
BCD码(Binary-Coded Decimal‎)亦称二进码十进数或二-十进制代码。用4位二进制数来表示1位十进制数中的0~9这10个
数码。是一种二进制的数字编码形式,用二进制编码的十进制代码。BCD码这种编码形式利用了四个位元来储存一个
十进制的数码,使二进制和十进制之间的转换得以快捷的进行。
PF 奇偶标志,当结果操作数中偶数个"1",置PF=1,否则,PF=0;
SF 符号标志,当结果为负时,SF=1;否则,SF=0。溢出时情形例外;
CF 进位标志,最高有效位产生进位值,例如,执行加法指令时,MSB(最高位)有进位,置CF=1;否则,CF=0;
OF 溢出标志,若操作数结果超出了机器能表示的范围,则产生溢出,置OF=1,否则,OF=0。
标志寄存器的一些值是一些其它相关汇编指令在执行过程中需要参考的值。比如条件跳转指令就需要参考ZF等标志位。

你可能感兴趣的:(栈帧)