无法理解“剥削艺术”中的缓冲区溢出示例

时间:2013-03-11 03:13:40

标签: security buffer-overflow exploit shellcode

我的问题非常相似,但与this one不一样。

我在书中运行了exploit_notesearch.c的相同示例:Hacking,我的64位操作系统上的剥削艺术,Archlinux,它不起作用。

从上面的链接中我了解到它无法在大多数64位系统上运行。但我仍然无法理解为什么程序必须这样做:ret = (unsigned int)&i - offset。为什么我不能这样做:ret = (unsigned)shellcode以便我可以用shellcode的起始地址替换易受攻击程序的返回地址?

1 个答案:

答案 0 :(得分:3)

ret = (unsigned)shellcode会使ret等于程序中shellcode数组的地址。但该地址不是目标程序(notesearch.c)中恶意代码的地址。目标进程将其searchstring放在堆栈上,这样您的恶意代码也将被放入目标进程的堆栈中。

在过去,进程的内存布局通常具有高度确定性 - 攻击者通常可以很好地预测堆栈缓冲区的位置(特别是如果他们确切地知道目标软件的哪个版本受到攻击)。因此,很容易知道searchstring和shellcode的确切地址是什么。

然而,今天,许多操作系统将执行ASLR。因此,试图执行堆栈注入的shellcode的攻击者必须首先找到堆栈。系统模糊了攻击者的相关内存地址。必须猜测这些值,并且由于应用程序崩溃(分段错误),错误的猜测通常无法恢复。

为了在涉及一些猜测时提高成功的机会,活动shellcode通常会在大量可执行机器代码之前执行,这些代码不执行任何有用的操作 - 称为“NOP sled”或“NOP slide”。

因此即使ret = (unsigned int)&i - offset也无法确保您的shellcode会成功执行。