返回堆栈上的地址

时间:2011-12-03 21:56:00

标签: assembly buffer-overflow

我正在研究一个处理溢出缓冲区(缓冲区溢出炸弹)的学校项目我相信很多人已经完成或听说过它。我不是在寻找如何做到这一点,而只是关于回报的一般性问题。是否可以返回堆栈中的地址?我只是问,因为这似乎是解决阶段的最合理的方法,但它保持segfaulting,这通常发生在尝试访问你的" sandbox"之外的内存时。但我认为我的程序可以访问堆栈,因为它不是一个常见的查询问题,我认为这里有人可能知道

我应该提到该程序旨在允许您从堆栈执行代码

由于

3 个答案:

答案 0 :(得分:1)

当然,您可以返回堆栈中的地址。但如果堆栈内存不可执行(取决于CPU功能和操作系统),则会发生内存访问冲突异常。

答案 1 :(得分:1)

在x86上,返回堆栈中的位置

  LEA   EAX, offset[ESP]
  JMP   EAX

正如其他人所指出的那样,数据执行防止可能会阻止处理器 从JMP执行后实际执行堆栈区域开始。

返回地址为的堆栈的位置

  JMP   offset[ESP]

同样,如果目标位置在“数据页”中,DEP将阻止执行。 (您可以调用Windows并删除该数据上的DEP;我不确定您是否可以 为堆栈做那个。)

答案 2 :(得分:0)

通常,处理器指令集和编译器使用的调用约定组合在一起。有些处理器只会使用堆栈上的地址返回,有些处理器可能只能使用其他寄存器中的地址,有些处理器只能由程序员使用。当然,如果你想弹出一个堆栈的地址,你只需要注册分支类型处理器,或者从寄存器中为堆栈类型处理器放置一个地址。

像x86这样的旧设计通常会将调用指令放在堆栈上,并且返回指令将返回地址从堆栈中拉出来使用它。使用x86,CS也可以在堆栈中。此类中的处理器通常会将标志放在堆栈上以进行中断,并从中断返回弹出标志和返回地址。

根据处理器规则,您可以选择从函数返回的方式,制定约定,以便所有函数使用相同的规则,编译器使用该约定。

您需要知道您使用的处理器以及您尝试使用或利用的调用约定。