1.缓冲区溢出的两个操作:
破坏栈 smash the stack
修饰函数返回地址 modify the return address of the function
2.内存的存储分配:
from high address to low address:
command-line arguments and environment variables:程序运行之前存在的变量和环境变量
stack:栈,存放函数参数,返回地址和函数本地变量的位置。存储时往下走。
heap:堆,存放动态存储空间,malloc从此分配。存储时往上走。
uninitialized data(Bss egment):存放所有未初始化的变量,包括全局和静态变量
initialized data(Data Segment):存放所有初始化的变量
text:存储代码,一般只读
3.常用寄存器:
- EIP:指令寄存器。存放下一个CPU指令存放的内存地址,当CPU执行完当前指令后,就会从EIP寄存器中读取下一条指令的内存地址。每条指令执行过后,它的大小就会根据新指令的大小变化。
- ESP:堆栈寄存器。存放栈顶,也就是最后一个元素的位置。常处于最低的内存地址。堆栈的顶部是地址小的区域,压入堆栈的数据越多,ESP就会越来越小。在32位平台上,ESP每次减少4字节。
- EBP:基指针寄存器。用来存储当前函数状态的基地址,在函数运行时不变,可以用来索引确定函数参数或局部变量的位置。
4.栈的基本模型及函数调用状态
参数N | 高->低地址 |
---|---|
arg2 | 调用参数 ,函数中的参数从右至左入栈 |
arg1 | |
Return Address | 返回地址 ,将进行调用之后的下一条指令地址作为返回地址压栈,存储EIP信息 |
Caller’s ebp | 将当前寄存器的值(调用函数的 |