我找不到一个能很好回答这个问题的来源。我知道nop sled是一种用于绕过缓冲区溢出攻击中的堆栈随机化技术,但我无法理解它是如何工作的。
能给出一个简单的例子来说明这种方法吗?
像128字节的nop sled这样的术语是什么意思?
我找不到一个能很好回答这个问题的来源。我知道nop sled是一种用于绕过缓冲区溢出攻击中的堆栈随机化技术,但我无法理解它是如何工作的。
能给出一个简单的例子来说明这种方法吗?
像128字节的nop sled这样的术语是什么意思?
一些攻击包括让程序跳转到特定地址并继续从那里运行。注入的代码必须事先以某种方式加载到该精确位置。
堆栈随机化和其他运行时差异可能会使程序将要跳转的地址无法预测,因此攻击者在大量内存范围内放置NOP sled。如果程序跳转到滑板上的任何位置,则会运行所有剩余的NOP,什么也不做,然后运行payload代码,就在滑板旁边。
攻击者使用NOP sled的原因是为了使目标地址更大:代码可以跳转到滑板上的任何位置,而不仅仅是注入代码的开头。
一个128字节的NOP sled只是一个宽度为128字节的NOP指令组。
注 #1:NOP(No-Operation)是大多数(全部?)体系结构中可用的一条指令,除了占用内存和一些运行时之外,什么也不做。
注 #2:在具有可变长度指令的架构中,NOP指令通常只有一个字节的长度,因此它可以用作方便的指令填充。不幸的是,这也使得制作NOP sled易如反掌。
times 128 nop
可以汇编出128个单字节NOP指令(opcode 0x90)。x86还有多字节的NOP指令,任何好的汇编器都会在ALIGN
指令中使用它们进行填充。这对于正常代码(非注入式)的性能非常重要,特别是在函数内部用于对齐分支目标(例如循环的顶部),因为NOP实际上会运行一次,并且解码一个长NOP比解码许多相同长度的短NOP更快。(而且许多短NOP甚至会导致间接的性能影响,如防止32B代码块进入uop缓存)。 - Peter Cordes