栈内存在进程中的作用:
(1)暂时保存函数内的局部变量。
(2)调用函数时传递参数。
(3)保存函数返回后的地址。
栈其实是一种数据结构,它按照FILO(First In Last Out,后进先出)的原则存储数据。
一个进程中,栈顶指针(ESP)初始状态指向栈底端。执行PUSH命令将数据压入栈时,栈顶指针就会上移到栈顶端。执行POP命令从栈中弹出数据时,若栈为空,则栈顶指针重新移动到栈底端。换言之,栈是一种由高地址向低地址扩展的数据结构,图5-1中,栈是由下往上扩展的。由于栈具有这种特征,所以我们常常说“栈是逆向扩展的”,向栈中压数据就像一层层砌砖,每向上砌一层,砖墙就增高一点儿。
在OllyDbg里运行stack.exe文件,为一个示例
如图,ESP(栈顶)的指针为0019FF74,右下角也是。
- 在代码窗口中按F7键(Step Into),执行401000地址处的PUSH100命令。ESP值变为0019FF70,比原来减少了4个字节。并且当前的栈顶指针指向0019FF70地址,栈顶该地址中保存着100这个值。