在 linux 上使用 off by one framepointer overwrite 时获得利用可靠性

信息安全 linux 开发
2021-08-17 13:43:23

我们有一个程序容易被单字节帧指针覆盖。堆栈被标记为可执行,Linux 机器禁用了 aslr,禁用了堆栈 cookie,并且它是小端标准 x86。

我们可以运行:

buf[256];

for(int i=0; i <=256; i++)
  buf[i] = argv[1][i];

但是,我想将我的 shellcode 放入buf然后跳转到它。如果我使用正常的堆栈溢出,我可以通过转到一个已加载的库来获得利用可靠性,该库在jmp $esp某处编码了指令,然后将我的 shellcode 放在函数参数所在的位置等等。但这在这里是不可能的。

那么如果它是一个远程进程(你不能硬编码地址值)并且需要利用可靠性,你会怎么做?唯一想到的是堆栈对齐,我们可以预测低位(可能是 2 位还是 3 位?)。

我只需要知道帧指针的低字节,这样我就可以用更小的值控制 eip 覆盖它以指向 jmp esp,并且在 esp 处的指令就像一个短跳转 -0x80 或类似的东西。

我已经减少了帧指针 => ret 被执行 => 控制 eip => 将 eip 指向 jmp esp 指令 => 下一条指令是短跳转 -0xsomevalue 执行 => 有效负载被执行。

我考虑了其他启发式方法,例如将指向 jmp esp 的指针一遍又一遍地写入缓冲区,以便它更有可能控制 eip,但这样我的 jmp -0xsomevalue 方法将不再起作用。

2个回答

我在安全课上遇到了一个非常相似的家庭作业问题。您的漏洞利用的可靠性取决于缓冲区的大小。如果您溢出了一个特别大的缓冲区,那么您的漏洞利用将有更大的机会起作用。

以下是您的漏洞利用三明治的结构:

[NOPS][Shellcode (usually about ~60 bytes)][FP overwrite]

如您所知,您将只能覆盖Frame Pointer. 如果您足够幸运,这将导致 EIP 指向您的雪橇。如果您有一个大小为 265 的缓冲区(如示例中所示),那么一个好的沙子会是什么样子:

[NOPS * 150][Shellcode][FP overwrite] << FP Overwrite MUST be at index 256

现在正如我所说,您的漏洞利用的可靠性将取决于您可以生产的雪橇的大小。如果您的缓冲区是 1024 字节,那么您的漏洞利用将非常有效。

如果你为你的帧指针覆盖提供了一个很好的价值,那么你的漏洞利用将会取得更大的成功。在这里,创造最大可能的雪橇也将是关键。对于这个漏洞,使用它可能是安全的:

NOPS = (size of exploited buffer + 1) - length of shellcode - 1

简单地:

NOPS = (size of exploited buffer) - length of shellcode

这将为您在 NOP 雪橇上着陆提供最大的变化。现在只需使用 FP 覆盖值并找到一个非常一致的值。

关于一对一错误的有用信息:

nop 雪橇的工作原理:

这是我在课堂上必须阅读的文章,它真的很有帮助:

创建可靠的漏洞利用需要时间和耐心以及大量的调试。

我认为您正在寻找的是 NOP Sled 或 NOP Slide。当你执行短跳转时,你需要把它放在 NOP 幻灯片的中间,这样执行就会通过 NOP 滑动到你的 shellcode。

查看此站点以获取有关漏洞利用编写的详细信息。