2011-12-03 98 views
2

我正在处理一个处理溢出缓冲区(缓冲区溢出炸弹)的学校项目。我相信你们中的许多人已经做过或听说过它。我不是在寻找如何去做,而只是有一个关于回报的普遍问题。是否有可能返回到堆栈上的地址?我只问,因为这似乎是解决阶段最合乎逻辑的方式,但它保持segfaulting,这通常发生在尝试访问“沙盒”之外的内存时,但我认为该堆栈可供我的程序访问,因为它不是真是一个共同的问题查找我估计有人在这里可能知道返回到堆栈上的地址

我应该提到的程序设计,让你从堆栈中执行代码

感谢

+1

这是一个已经关闭了一段时间的漏洞。被称为“DEP(数据执行预防)”和“NX(不执行)位”。它阻止映射堆栈的内存页面具有可执行代码。你将不得不关掉这个工作,希望有实际的工作。或者挖掘一台真正的旧机器。询问superuser.com,操作系统配置不在这里的话题。 –

回答

1

在x86,返回到位置堆栈:

LEA EAX, offset[ESP] 
    JMP EAX 

正如其他人指出的那样,数据执行保护可以防止处理器 从在堆栈区域中实际执行一旦JMP具有执行。

要返回堆栈指定其地址的位置:

JMP offset[ESP] 

同样,如果目标位置是“数据页”,DEP将阻止执行。 (您可以打电话给Windows并删除该数据上的DEP;我不确定您是否可以使用 对堆栈执行此操作。)

1

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

0

正常情况下,处理器指令集和编译器使用的调用约定相结合。有些处理器只会使用堆栈中的地址返回,其他处理器可能只能使用其他寄存器中的地址,有些则由编程人员决定。当然,如果你希望弹出堆栈的地址,而只注册分支类型的处理器,或者从堆栈中只有一个类型的处理器的寄存器中放置一个地址,你可以自然选择。

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

基于处理器规则,您可以选择从函数返回的方式,因此会进行约定以使所有函数都使用相同的规则,并且编译器使用该约定。

您需要知道您使用的处理器稍微好一些,以及您尝试使用或利用的调用约定。