缓冲区溢出攻击格式

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

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

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

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

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

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

JUNK + return_address + NOPs + shellcode

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

这种简单的基于堆栈的缓冲区溢出漏洞无法在现代系统上运行。 Alpeh-One’s Smashing Stack for Fun和Profit不再适用,因为NX区域,堆栈金丝雀和ASLR,所有这些都是Windows和Linux上的默认设置。

你应该拿一份:

在此处输入图像描述