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