NOP雪橇是如何工作的?

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

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

128字节的nop sled是什么意思?

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

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

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

一个128字节的NOP底座只是一组128字节宽的NOP入口。

注1:NOP(No-OPeration)是大多数(所有)体系结构中可用的指令,除了占用内存和运行时外,什么也不做。

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

由于我不能发表评论,所以加上rodrigo的解释 – 即使是NOP雪橇,缓冲区在存储器中的大概位置也必须提前预测。 一种近似内存位置的技术是使用附近的堆栈位置作为参照系。 通过从这个位置减去一个偏移量,可以获得任何variables的相对地址。

SIDENOTE:在x86架构上,NOP指令相当于hex字节0x90,因此完整的利用缓冲区可能如下所示:

| NOP雪橇| Shellcode | 重复的返回地址|

看到EIP寄存器指向在NOP底座中find的任何地址,它会在执行每个NOP指令时递增,一次一个,直到最后到达shellcode