0

我在网站上找到了一些相关的帖子,但没有一个能解释我的问题。代码在这里描述: 链接

我的问题如下:

笔者尝试将notesearch.c程序中strcpy()函数的返回地址改写为缓冲区中的一个,这样shellcode(我理解为植入内存中的机器码)就会被执行。

为此,他创建了一个看起来像这样的缓冲区: nop nop nop ... | 外壳代码.. | 退货地址

根据我在调用 strcpy() 函数后的理解,缓冲区被放入堆栈并将返回值覆盖到 notesearch.c 的 main。他这样做是为了当 strcpy() 完成运行并想要返回到 main 时,他将从缓冲区调用返回值。

我不明白的是:

  1. 在我看来,注入的返回地址总是与原始地址完全一致。这个怎么可能?

  2. 书中说注入的返回地址指向同一个缓冲区中的shellcode。为什么我们要将 shellcode 放在同一个缓冲区而不是内存的另一部分?这不会导致无限循环吗?

  3. 为什么我们不能将返回地址设置为缓冲区中 shellcode 的地址?或者是变量shellcode?

  4. 谁能详细说明返回地址是如何计算的以及我们为什么需要偏移量?

4

1 回答 1

0

为什么我们要将 shellcode 放在同一个缓冲区而不是内存的另一部分?

好吧,只要您可以在该内存区域中执行指令,您实际上可以自由地将 shellcode 放置在您想要的任何位置。话虽如此,这个例子演示了一个基于堆栈的缓冲区溢出,在这种利用中,很容易发现当前堆栈帧内的局部变量的偏移量。

这不会导致无限循环吗?

假设 shellcode 不包含这样的无限循环——不。然而,由于您正在修改执行流程,这可能会产生错误。这实际上取决于 shellcode。例如,大多数 shellcode 用于生成 shell - 让我们假设使用了 exec 函数系列 - 所以一旦 shell 生成原始可执行映像将被 shell 覆盖。

为什么我们不能将返回地址设置为缓冲区中 shellcode 的地址?

你可以,这只需要更精确的计算。使用 NOP 雪橇您有多个可能的命中,这将使您的 shellcode 执行。

谁能详细说明退货地址是如何计算的?

作者获取了第一个声明的局部变量的地址,并计算了到易受攻击的缓冲区的位移。这里的第一个缺点是第一个声明的变量 ( i ) 在编译后可能不是第一个局部变量。如果要确保这样的约束,解决方法是使用结构(请参阅:堆栈上的局部变量分配顺序)。

作者可能多次运行程序并调整偏移量,直到触发 shellcode。请记住,计算缓冲区的确切地址实际上取决于平台和编译器。您将不得不调试您的程序并检查编译器如何详细说明堆栈帧等。

为什么我们需要偏移量?

由于堆栈帧布局,需要“有效”偏移来找到将命中 NOP 雪橇的地址。

于 2013-05-28T10:54:12.730 回答