6

我了解典型的基于堆栈的缓冲区溢出攻击有效负载如下所示:

(返回地址) (返回地址) ... (返回地址) (返回地址) (返回地址) (返回地址) (NOP) (NOP) (NOP) (NOP) ... (NOP) (NOP) (NOP) ) (NOP) (外壳代码)

我也明白 shellcode 的成功执行取决于几件事:

  1. 有效载荷的重复返回地址部分必须覆盖该堆栈帧的返回指针
  2. 该返回地址必须是 NOP 幻灯片某些部分的地址(或 shellcode 的开头)

我不明白的是,使用这种技术的恶意软件总能把这两件事做好。在我看来,为了制作有效的有效载荷,攻击者必须知道目标缓冲区的大致地址及其与返回地址的大致距离。

这两个通常是确定性的吗?例如,如果攻击者在他的机器上运行之前进行了几次反复试验,那么相同的有效负载是否可以在具有完全相同二进制文件的所有其他机器上运行?

4

3 回答 3

6

为了制作有效的有效载荷,攻击者必须知道目标缓冲区的大致地址及其与返回地址的大致距离。

你说的对。事实上,为了编写正确的漏洞利用程序,您必须使用调试器进行一些操作。一旦你编写并测试了它,如果二进制文件在不同的机器上是相同的,exploit 应该可以正常工作。

(工作正常有点乐观。假设应该启动shellcode。攻击的有效性可能取决于其他因素..)

于 2011-04-03T15:05:58.213 回答
6

确定内存布局的准确性完全取决于您正在破坏的函数的堆栈帧。有时偏移可能非常准确,甚至不需要 nop 雪橇,但无论如何拥有一个雪橇是个好主意。如果您在调试器中多次触发该问题,您可以了解堆栈的混乱程度。其他因素可能会影响偏移量的大小。例如,如果程序的不同版本可以改变偏移量,例如为windows 2000 和 windows xp编写的漏洞利用。应用程序的不同语言分布也会影响偏移量的大小。

然而,ASLR给这种利用方法带来了严重的问题。 基于浏览器的漏洞利用通常使用堆喷射来绕过 ASLR。

于 2011-04-03T22:03:20.410 回答
0

当然,地址并不总是相同,具体取决于系统和二进制文件,恶意软件用来提高机会的一种黑客攻击是使用不同的返回地址生成多个有效负载(例如,如果有 10 个 NOPS,则增加 10)并尝试所有这些直到有效。

于 2011-04-03T15:26:36.663 回答