2013-02-07 100 views
52

我一直在打开我的头,无法找到一个很好的答案来回答这个问题。我知道nop sled是一种用于在缓冲区溢出攻击中规避堆栈随机化的技术,但我无法理解它的工作原理。NOP雪橇是如何工作的?

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

128字节nop sled是什么意思?

+0

只是想知道您计划学习如何实际应用的是什么? –

+6

我是CE本科生,在科比,奥哈拉朗教科书CS:APP上学习这个主题。我也为我的大学IT安全工作,所以这对我感兴趣。 – amorimluc

+4

这就是社会工程师会说的! ;) – DeepS1X

回答

64

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

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

攻击者使用NOP底座的原因是为了使目标地址更大:代码可以跳到底座的任何位置,而不是在注入代码的开始处。

一个128字节的NOP底座只是一组128字节宽的NOP入口。注意#1:NOP(No-OPeration)是大多数(全部)体系结构中可用的指令,除了占用内存和某些运行时间外,它什么都不做。注2:在具有可变长度指令的体系结构中,NOP指令通常只有一个字节长度,所以它可以用作方便的指令填充。不幸的是,这也使得NOP雪橇很容易做到。

+0

好的,我认为我得到了燕尾蓬的主旨。有没有你可以指出的地方,它显示了一个nop-sled的汇编代码示例? – amorimluc

+0

Nop雪橇对我来说仍然有点抽象。一个例子真的有帮助。 – amorimluc

+10

@amorimluc这个例子存在,但在15行左右真的很无聊...... –

0

因为我不能评论,所以要添加到rodrigo的解释中 - 即使使用NOP雪橇,缓冲区在内存中的大致位置也必须事先进行预测。一种近似内存位置的技术是使用附近的堆栈位置作为参照系。通过从该位置减去偏移量,可以获得任何变量的相对地址。

旁注:x86架构NOP指令等价于十六进制字节的0x90因此完成利用缓冲区可能是这个样子:

| NOP雪橇| Shellcode |重复返回地址|

看到犹如EIP寄存器指向在NOP雪橇发现的任何地址,这将在执行每个NOP指令,一次一个递增,直到它最终达到的shellcode

-1

在的上下文中Linux和c,我确定'0x90'是关于NOP雪撬的重要信息。关于内核开发的书籍应该很有帮助!

+0

0x90是单字节NOP的x86操作码。在Linux和C工作的其他体系结构上,NOP是一种不同的位模式。 –