NOP 雪橇是如何工作的?

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

说明这种方法的一个简单示例是什么?

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

61308 次浏览

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

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

攻击者使用 NOP 雪橇的原因是为了使目标地址更大: 代码可以在雪橇的任何地方跳转,而不是正好在注入代码的开始。

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

注1: NOP (No-Operation)是一种可用于大多数(全部?)的指令除了占用内存和某些运行时之外,它们什么也不做。

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

为了增加罗德里格的解释-即使有一个 NOP 雪橇,大约位置的缓冲区在内存中必须预先预测。近似内存位置的一种技术是使用附近的堆栈位置作为参考框架。通过从这个位置减去偏移量,可以获得任何变量的相对地址。

旁注: 在 x86架构中,NOP 指令等效于十六进制字节0x90,因此一个完整的利用缓冲区可能看起来像这样:

重复回信地址

看起来好像 EIP 寄存器指向在 NOP 雪橇中发现的任何地址,它会在执行每个 NOP 指令时增加,一次一个,直到最终到达 shell 代码