我找不到一个好的来源来回答这个问题。我知道nop sled是一种在缓冲区溢出攻击中用来规避堆栈随机化的技术,但我不知道它是如何工作的。
有什么简单的例子可以说明这种方法?
像128字节nop-sled这样的术语是什么意思?
一些攻击包括让程序跳转到特定地址并从那里继续运行。注入的代码必须以某种方式预先加载到那个确切的位置。
堆栈随机化和其他运行时差异可能会使程序跳转的地址无法预测,因此攻击者将NOP底座放置在大范围的内存中。如果程序跳到底座中的任何位置,它将运行所有剩余的NOP,不执行任何操作,然后运行底座旁边的有效负载代码。
攻击者使用NOP底座的原因是使目标地址更大:代码可以跳到底座中的任何位置,而不是正好在注入代码的开头。
128字节的NOP底座只是一组128字节宽的NOP入侵。
注1:NOP(无操作)是一种在大多数(所有?)体系结构中可用的指令,除了占用内存和一些运行时外,它什么都不做。
注#2:在具有可变长度指令的体系结构中,NOP指令的长度通常只有一个字节,因此它可以用作方便的指令填充。不幸的是,这也使得NOP雪橇变得很容易。
补充rodrigo的解释-即使使用NOP底座,也必须提前预测缓冲区在内存中的大致位置。一种用于近似的存储器位置的技术是使用附近的堆栈位置作为参考帧。通过从这个位置减去偏移量,可以获得任何变量的相对地址。
旁注:在x86体系结构上,NOP指令相当于十六进制字节0x90,因此完整的漏洞利用缓冲区可能看起来像这样:
|NOP底座|外壳代码|重复返回地址|
就好像EIP寄存器指向NOP底座中的任何地址一样,它会在执行每个NOP指令时递增,一次一个,直到它最终到达外壳代码