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