69

我找不到一个很好的来源来回答这个问题。我知道 nop sled 是一种用于在缓冲区溢出攻击中规避堆栈随机化的技术,但我无法理解它是如何工作的。

什么是说明此方法的简单示例?

像 128 字节 nop sled 这样的术语是什么意思?

4

2 回答 2

94

一些攻击包括使程序跳转到特定地址并从那里继续运行。注入的代码必须事先以某种方式加载到该确切位置。

堆栈随机化和其他运行时差异可能使程序跳转的地址无法预测,因此攻击者将 NOP sled 放置在大范围的内存中。如果程序跳转到 sled 的任何位置,它将运行所有剩余的 NOP,什么都不做,然后将运行有效负载代码,就在 sled 旁边。

攻击者使用 NOP sled 的原因是为了使目标地址更大:代码可以跳转到 sled 中的任何位置,而不是恰好在注入代码的开头。

一个 128 字节的 NOP sled 只是一组 128 字节宽的 NOP 指令。

注意#1:NOP(无操作)是大多数(全部?)架构中可用的指令,除了占用内存和一些运行时之外什么都不做。

注意#2:在具有可变长度指令的体系结构中,NOP 指令通常只有一个字节的长度,因此它可以用作方便的指令填充。不幸的是,这也使得制作 NOP 雪橇变得容易。

于 2013-02-07T20:47:50.730 回答
3

补充 rodrigo 的解释 - 即使使用 NOP 雪橇,也必须提前预测内存中缓冲区的大致位置。一种近似内存位置的技术是使用附近的堆栈位置作为参考框架。通过从该位置减去偏移量,可以获得任何变量的相对地址。

旁注:在 x86 架构上,NOP 指令等同于十六进制字节 0x90,因此完整的漏洞利用缓冲区可能如下所示:

| NOP 雪橇 | 外壳代码 | 重复退货地址|

看起来好像 EIP 寄存器指向在 NOP sled 中找到的任何地址,它会在执行每条 NOP 指令时递增,一次一条,直到它最终到达 shellcode

于 2017-11-03T20:33:28.893 回答