Assembly 缓冲区溢出攻击-返回堆栈上的地址?
我有一个任务,它告诉我需要通过从堆栈中运行代码来执行缓冲区溢出。我一直在尝试这样做,但每次我用我希望代码驻留的堆栈位置替换堆栈的“ret”位置时,它都会保持seg错误。如果我将“ret”位置替换为physical.o文件中存在的地址(如物理汇编代码),它就可以正常工作。不允许您返回堆栈上的位置吗?我很困惑,如果不能返回堆栈地址,如何使用自己的汇编代码执行缓冲区溢出。。。(顺便说一句,我使用的是IA32 little endian机器) 我的步骤:Assembly 缓冲区溢出攻击-返回堆栈上的地址?,assembly,x86,buffer-overflow,Assembly,X86,Buffer Overflow,我有一个任务,它告诉我需要通过从堆栈中运行代码来执行缓冲区溢出。我一直在尝试这样做,但每次我用我希望代码驻留的堆栈位置替换堆栈的“ret”位置时,它都会保持seg错误。如果我将“ret”位置替换为physical.o文件中存在的地址(如物理汇编代码),它就可以正常工作。不允许您返回堆栈上的位置吗?我很困惑,如果不能返回堆栈地址,如何使用自己的汇编代码执行缓冲区溢出。。。(顺便说一句,我使用的是IA32 little endian机器) 我的步骤: 溢出32个字符的缓冲区(放置所有FF) 覆盖%e
这会导致seg故障请确保堆栈页标记为可执行;现代操作系统通常将堆栈设置为不可执行,因此,当您将程序计数器设置为堆栈时,堆栈将立即发生故障。这在许多方面取决于平台。并不是所有的内存都是可执行的,在现代系统中,通常在可写的内存和可执行的内存之间有一个异或,正是出于这些原因。如果您使用的是linux,那么您可能希望通过对
mprotect
的额外调用来构建堆栈,因此您可以将堆栈更改为可执行的。这将需要一个更复杂和构造的有效载荷,但是可行的
另一种选择是,返回地址后的参数仍然存在问题,这意味着调用另一个函数可能会“幸运”,因为您没有损坏堆栈,但当您注入代码时,您确实做到了
进一步阅读:
我认为对于这个赋值,我们假设堆栈被标记为可执行(否则他们不会给我们这样的赋值)。还有其他想法吗?非常感谢。