c - 基于堆栈的缓冲区溢出攻击中修改后的返回地址是如何近似的?

标签 c security x86 buffer-overflow exploit

据我了解,典型的基于堆栈的缓冲区溢出攻击有效负载如下所示:

(return address) (return address) ... (return address) (return address) (return address) (return address) (NOP) (NOP) (NOP) (NOP) ... (NOP) (NOP) (NOP) (NOP) (SHELLCODE)

我也明白 shellcode 的成功执行取决于以下几点:

  1. 重复返回地址部分 有效负载必须覆盖 该堆栈帧的返回指针
  2. 返回地址必须是 NOP 的某些部分的地址 幻灯片(或开头 外壳代码)

我不明白的是,使用这种技术的恶意软件如何总能正确处理这两件事。在我看来,为了制作有效载荷,攻击者必须知道目标缓冲区的大致地址及其与返回地址的大致距离。

这两个通常是确定性的吗?例如,如果攻击者进行了几次试验和错误直到它在他的机器上工作,那么相同的有效负载是否可以在具有完全相同的二进制文件的所有其他机器上工作?

最佳答案

确定内存布局的准确性完全取决于您正在破坏的函数的堆栈帧。有时偏移量可能非常准确,甚至不需要 nop sled,但无论如何拥有一个是个好主意。如果您在调试器中多次触发该问题,您可以了解堆栈的困惑程度。其他因素会影响偏移量的大小。例如,如果偏移量可以根据程序的不同版本而改变,例如为 windows 2000 and windows xp 编写的漏洞利用程序.应用程序的不同语言分布也会影响偏移量的大小。

然而,ASLR这种开发方法会导致严重的问题。 Heap Spraying通常被基于浏览器的漏洞利用来绕过 ASLR。

关于c - 基于堆栈的缓冲区溢出攻击中修改后的返回地址是如何近似的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5530278/

相关文章:

x86 - promise 与退休指令

c++ - 不使用堆内存的高速 CAN 数据处理

在编写 Python C 扩展时创建 Python 列表

c - C 中的虚拟 Shell 在关闭外部进程后会出现问题

javascript - Caja 准备好投入生产了吗?

c++11 - x86-SSE指令是否具有自动发布获取指令?

c++ - 为什么 gmtime 和 localtime 给我相同的结果?

java - 在 Applet 中使用 AWTEventListener 时访问被拒绝

security - 在客户端将Json Web token JWT存储在哪里最安全?

.net - 64 到 32 位互操作 - 如何?