【发布时间】:2014-02-16 22:49:33
【问题描述】:
我目前正在尝试了解 IA32 架构中的汇编。我一直以为我理解了堆栈结构,直到我运行了一些缓冲区溢出漏洞利用代码,该代码将返回地址推到堆栈顶部然后返回。然后,令我惊讶的是,程序返回到我压入堆栈的那个地址。我最初认为基指针将用于返回,因为它位于返回地址旁边。但是,我没有触摸基本指针。那么,Assembly 是如何知道返回哪里的呢?
谢谢。
【问题讨论】:
-
程序集是一种语言。它什么都不“知道”。
-
CALL 将 EIP 寄存器值压入堆栈。 RET 恢复它。如果你的书没有解释这一点,请找另一本书,非常基本的东西。
-
返回时不使用 EBP 基指针。返回地址是堆栈顶部的任何值。 EBP 只是一个“助手”,子程序可以使用它来更轻松地查找参数和本地堆栈变量