Assembly 缓冲区溢出攻击-返回堆栈上的地址?

Assembly 缓冲区溢出攻击-返回堆栈上的地址?,assembly,x86,buffer-overflow,Assembly,X86,Buffer Overflow,我有一个任务,它告诉我需要通过从堆栈中运行代码来执行缓冲区溢出。我一直在尝试这样做,但每次我用我希望代码驻留的堆栈位置替换堆栈的“ret”位置时,它都会保持seg错误。如果我将“ret”位置替换为physical.o文件中存在的地址(如物理汇编代码),它就可以正常工作。不允许您返回堆栈上的位置吗?我很困惑,如果不能返回堆栈地址,如何使用自己的汇编代码执行缓冲区溢出。。。(顺便说一句,我使用的是IA32 little endian机器) 我的步骤: 溢出32个字符的缓冲区(放置所有FF) 覆盖%e

我有一个任务,它告诉我需要通过从堆栈中运行代码来执行缓冲区溢出。我一直在尝试这样做,但每次我用我希望代码驻留的堆栈位置替换堆栈的“ret”位置时,它都会保持seg错误。如果我将“ret”位置替换为physical.o文件中存在的地址(如物理汇编代码),它就可以正常工作。不允许您返回堆栈上的位置吗?我很困惑,如果不能返回堆栈地址,如何使用自己的汇编代码执行缓冲区溢出。。。(顺便说一句,我使用的是IA32 little endian机器)

我的步骤:

  • 溢出32个字符的缓冲区(放置所有FF)
  • 覆盖%ebp位置(实际值存储在该位置)
  • 用堆栈上的地址而不是程序集文件中的地址覆盖其上方的“ret”点
  • 植入我的程序集字节码(我确保在开始时添加nop指令,以确保以4字节的倍数完成)
  • 运行它

  • 这会导致seg故障

    请确保堆栈页标记为可执行;现代操作系统通常将堆栈设置为不可执行,因此,当您将程序计数器设置为堆栈时,堆栈将立即发生故障。

    这在许多方面取决于平台。并不是所有的内存都是可执行的,在现代系统中,通常在可写的内存和可执行的内存之间有一个异或,正是出于这些原因。如果您使用的是linux,那么您可能希望通过对
    mprotect
    的额外调用来构建堆栈,因此您可以将堆栈更改为可执行的。这将需要一个更复杂和构造的有效载荷,但是可行的

    另一种选择是,返回地址后的参数仍然存在问题,这意味着调用另一个函数可能会“幸运”,因为您没有损坏堆栈,但当您注入代码时,您确实做到了

    进一步阅读:


  • 我认为对于这个赋值,我们假设堆栈被标记为可执行(否则他们不会给我们这样的赋值)。还有其他想法吗?非常感谢。