7

通常我们都会看到基本的缓冲区溢出格式:- NOPs + shellcode + return_address

我们为什么不使用, NOPs + return_address + shellcode?我们将返回地址指向 shellcode 的开头?

我猜这是因为如果漏洞在 main() 中,我们可能会尝试在堆栈段之外写入数据。我对吗?如果我是,这是唯一的原因吗?

哦,是的,我不是指使用 return-to-libc、ptrace 等的其他类型的攻击;我只是想知道为什么最基本的缓冲区溢出攻击以第一种方式演示,而不是无处不在。

4

1 回答 1

11

返回地址可以在 the 之前shellcode+nop sled或之后。例如,如果您正在写入靠近堆栈顶部的变量,您可能必须写入您nop sled+shell code过去的返回地址 (EIP),因为可能没有足够的空间。

但是,NOP sled 将始终位于 shell 代码旁边。原因是因为您使用 nop 雪橇使您的 shell 代码的目标尽可能大。如果您的 EIP 从您的 shell 代码中指向 +=100 字节,那么您需要使用超过 100 字节的 nop 雪橇来保证您会达到目标。因此NOPs + return_address + shellcode无效。一个常见的漏洞利用字符串如下所示:

JUNK + return_address + NOPs + shellcode

当然,"return-to-libc"风格攻击不需要 shellcode 或 nop 雪橇。

这种简单的基于堆栈的缓冲区溢出漏洞在现代系统上是行不通的。由于 NX 区域、堆栈金丝雀和 ASLR,Alpeh-One 的 Smashing The Stack For Fun and Profit 不再有效,所有这些都是 Windows 和 Linux 上的默认设置。

你应该拿起一份:

在此处输入图像描述

于 2011-03-13T09:42:05.133 回答