《逆向工程核心原理》读书笔记——第5章 栈

一级目录

5.1 栈

栈内存在进程中的作用如下:
  (1)暂时保存函数内的局部变量。
  (2)调用函数时传递参数。
  (3)保存函数返回后的地址。
  栈其实是一种数据结构,它按照FILO (First In Last Out,后进先出)的原则存储数据。后面会通过一个示例向大家证明这一点。

5.1.1 栈的特征

栈内存的结构一般如图5-1所示,下面简单讲解一下。
在这里插入图片描述

  一个进程中,栈顶指针(ESP)初始状态指向栈底端。执行PUSH命令将数据压入栈时,栈顶指针就会上移到栈顶端。执行POP命令从栈中弹出数据时,若栈为空,则栈顶指针重新移动到栈底端。换言之,栈是一种由高地址向低地址扩展的数据结构,图5-1中,栈是由下往上扩展的。由于栈具有这种特征,所以我们常常说“栈是逆向扩展的”,向栈中压数据就像一层层砌砖,每向上砌一层,砖墙就增高一点儿。

5.1.2栈操作示例

  栈实际是怎样操作的呢?下面利用OllyDbg为大家准备了一个简单示例( Stack.exe),以帮助各位理解。
  图5-2显示了栈的初始状态,栈顶指针的值为0019FF74,观察右下角的栈窗口,可以看到ESP指向的地址及其值。
在这里插入图片描述

图5-2 栈的初始状态

  在代码窗口中按F7键( Step Into ),执行401000地址处的PUSH 100命令。
  图5-3中ESP值变为0019FF70,比原来减少了4个字节。并且当前的栈顶指针指向0019FF70地址,该地址中保存着100这个值。换言之,执行PUSH命令时,数值100被压入栈,ESP随之向上移动,即ESP的值减少了4个字节。再次按F7键 ( Step Into ),执行401005地址处的POP EAX命令。
在这里插入图片描述

图5-3 PUSH命令

  执行完POP EAX命令后,ESP值又增加了4个字节,变为0019FF74,栈又变为图5-2中的初始状态,如图5-4所示。换言之,从栈中弹出数据后,ESP随之向下移动。向栈压入数据与从栈中弹出数据时,栈顶指针的变化情形归纳如下:
  向栈压入数据时,栈顶指针减小,向低地址移动;从栈中弹出数据时,栈顶指针增加,向高地址移动。
在这里插入图片描述

图5-4 POP命令

  还请记住,栈顶指针在初始状态下指向栈底。这就是栈的特征。
  上面这个简单示例验证了栈的工作原理,展现了向栈压入或弹出数据时栈顶指针的变化规律。程序调试中,栈与栈顶指针的变化是十分重要的,调试时要密切关注。

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值