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

时间:2012-02-19 21:00:13

标签: assembly x86 buffer-overflow

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

我的步骤:

  1. 溢出32个字符缓冲区(放入所有FF)
  2. 覆盖%ebp位置(存储实际值)
  3. 用堆栈上的地址覆盖其上方的“ret”点而不是汇编文件中的地址
  4. 植入我的汇编字节代码(我确保在开始时添加nop指令以确保它以4个字节的倍数完成)
  5. 运行它
  6. 这会导致段错误

2 个答案:

答案 0 :(得分:4)

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

答案 1 :(得分:1)

这在很多方面取决于平台。并非所有内存都是可执行的,并且在现代系统上通常存在可写的内存或可执行的内存之间的异或,仅仅是出于这些原因。如果您使用的是linux,则可能需要使用mprotect的其他调用来构建堆栈,因此您将更改堆栈以使其可执行。这将需要更复杂和构造的有效载荷,但是可行。

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

进一步阅读:

  1. NX bit
  2. mprotect