2012-02-19 122 views
-1

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

我的步骤:

  1. 溢出的32字符缓存器(将所有FF)
  2. 覆盖的%ebp位置(与存储在那里的实际值)
  3. 覆盖它上面的 “RET” 斑用堆栈中的地址而不是程序集文件中的地址
  4. 注入我的程序集字节码(我确保我在开始时添加nop指令以确保它以4字节的倍数完成)
  5. 运行

,这导致了赛格故障

回答

4

确保栈页面被标记为可执行文件;现代操作系统通常会将堆栈设置为不可执行,因此当您将程序设置为它时,会立即发生段错误。

+0

我觉得这个任务,我们假设堆栈被标记为可执行文件(否则他们不会给我们像一个分配这个)。任何其他想法?谢谢。 – de1337ed 2012-02-19 21:10:26

1

这在很多方面取决于平台。并非所有的内存都是可执行的,而在现代系统中,通常存在可写的内存与可执行的内存之间的排他性或内存,正是出于这些原因。如果您使用的是linux,您可能需要额外调用mprotect来构建堆栈,因此您需要将堆栈更改为可执行文件。这将需要更复杂和构造的有效载荷,但是可行。

其他选项是你在返回地址后面的参数仍然有问题,这意味着你可能对其他函数的调用“很幸运”,因为你没有破坏堆栈,但是当你注入你的代码,你做到了。

对于进一步阅读:

  1. NX bit
  2. mprotect