NOP雪橇如何工作?

amo*_*luc 56 c assembly stack buffer-overflow nop

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

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

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

rod*_*igo 73

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

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

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

一个128字节的NOP底座只是一组128字节宽的NOP指令.

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

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

  • 在我上课时,NOP-sled不一定是字面NOP的序列,但也可能是一系列看起来像真实代码但没有净效果的指令.将一个加到寄存器然后从寄存器中减去一个没有明显的副作用,但扫描器识别比连续的一堆文字NOP指令困难得多. (17认同)
  • @amorimluc这个例子存在,但是在第15行之后它变得非常无聊...... (11认同)
  • @PascalCuoq现代nop幻灯片不包含大量的nop.为什么?安全性得到了加强,以检测这些"大量"的nop.Blackhats包含随机命令来伪造"真实"内存并引诱这种保护软件. (3认同)

小智 7

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

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

| NOP 雪橇 | 外壳代码 | 重复返回地址|

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