NOP sled是如何工作的?

76

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

能给出一个简单的例子来说明这种方法吗?

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


1
你好,我想知道你打算学习这个技能的实际应用是什么? - Alex Gordon
10
我是一名计算机工程本科生,正在学习Bryant和O'Hallaron合著的CS:APP教材中的这个主题。我同时在大学从事IT安全工作,所以对此很感兴趣。 - amorimluc
11
这就是一个社交工程师会说的话! ;) - DeepS1X
2个回答

111

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

堆栈随机化和其他运行时差异可能会使程序将要跳转的地址无法预测,因此攻击者在大量内存范围内放置NOP sled。如果程序跳转到滑板上的任何位置,则会运行所有剩余的NOP,什么也不做,然后运行payload代码,就在滑板旁边。

攻击者使用NOP sled的原因是为了使目标地址更大:代码可以跳转到滑板上的任何位置,而不仅仅是注入代码的开头。

一个128字节的NOP sled只是一个宽度为128字节的NOP指令组。

注 #1:NOP(No-Operation)是大多数(全部?)体系结构中可用的一条指令,除了占用内存和一些运行时之外,什么也不做。

注 #2:在具有可变长度指令的架构中,NOP指令通常只有一个字节的长度,因此它可以用作方便的指令填充。不幸的是,这也使得制作NOP sled易如反掌。


好的,我想我理解 nop-sleds 的要点了。你能指出一个显示 nop-sleds 汇编代码示例的地方吗? - amorimluc
Nop-sleds 对我来说还有点抽象。一个例子会很有帮助。 - amorimluc
或许 nop 块可以用 (...) 缩短一下。 - amorimluc
29
在我上过的那堂课中,NOP sled不一定是一连串字面意义上的NOP指令,它也可以是一系列看起来像真正代码但实际上没有实际效果的指令序列。例如向一个寄存器加1再从另一个寄存器减去1并没有重要的副作用,但这比一堆连续的字面NOP指令更难被扫描器识别。 - Adrian McCarthy
4
现代的nop幻灯片不包括一大段nop。为什么?安全性已经得到增强,可以检测到这些“大量”nop。黑客会添加随机命令来伪造“真实”的内存并诱骗这些保护软件。 - basickarl
在NASM中,times 128 nop可以汇编出128个单字节NOP指令(opcode 0x90)。x86还有多字节的NOP指令,任何好的汇编器都会在ALIGN指令中使用它们进行填充。这对于正常代码(非注入式)的性能非常重要,特别是在函数内部用于对齐分支目标(例如循环的顶部),因为NOP实际上会运行一次,并且解码一个长NOP比解码许多相同长度的短NOP更快。(而且许多短NOP甚至会导致间接的性能影响,如防止32B代码块进入uop缓存)。 - Peter Cordes

7
补充一下rodrigo的解释:即使使用NOP sled,也必须提前预测缓冲区在内存中的大致位置。一种近似内存位置的技巧是使用附近的栈位置作为参考框架。通过从该位置减去偏移量,可以得到任何变量的相对地址。
旁注:在x86架构中,NOP指令等同于十六进制字节0x90,因此完成的攻击缓冲区可能如下所示: | NOP sled | Shellcode | 重复返回地址|
如果EIP寄存器指向NOP sled中找到的任何地址,它将逐个执行每个NOP指令,直到最终到达shellcode。

你能否解释一下你的技巧,以找到缓冲区的近似内存位置?我不确定是否可能在没有使用内存泄漏信息(从漏洞或其他途径)的情况下实现。 - Duke Nukem

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接