通常我们都会看到基本的缓冲区溢出格式,它具有: -
NOPs + shellcode + return_address
为什么我们不使用,
NOPs + return_address + shellcode?
我们将返回地址指向shellcode的开头?
我猜这是因为如果漏洞位于main()中,我们可能会尝试在堆栈段外写入数据。我对吗?如果我,那是唯一的原因吗?
哦,是的,我不是指使用return-to-libc,ptrace等的其他类型的攻击;我只是想知道为什么最基本的缓冲区溢出攻击是以第一种方式展示而不是第二种方式。
答案 0 :(得分:10)
返回地址可以在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 sled。
这种简单的基于堆栈的缓冲区溢出漏洞无法在现代系统上运行。 Alpeh-One's Smashing Stack for Fun和Profit不再适用,因为NX区域,堆栈金丝雀和ASLR,所有这些都是Windows和Linux上的默认设置。
你应该拿一份: