1

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

我在书中运行了相同的exploit_notesearch.c 示例:Hacking, the Art of Exploitation on my 64-bit OS, Archlinux,但它不起作用。

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

4

1 回答 1

4

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

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

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

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

所以即使ret = (unsigned int)&i - offset不能确保你的 shellcode 会成功执行。

于 2013-03-11T09:43:07.810 回答