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

Posted 大灬白

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了《逆向工程核心原理》读书笔记——第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命令

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

以上是关于《逆向工程核心原理》读书笔记——第5章 栈的主要内容,如果未能解决你的问题,请参考以下文章

《逆向工程核心原理》读书笔记——第10章 函数调用约定

《逆向工程核心原理》读书笔记——第6章 汇编编写的exe程序入口

《逆向工程核心原理》读书笔记——第13章 PE文件格式

《逆向工程核心原理》读书笔记——第15章 调试UPX压缩的notepad程序

《逆向工程核心原理》读书笔记——第14章 运行时压缩

《逆向工程核心原理》读书笔记——第8章 Visual Basic编写的exe程序特征