论文导读:其中,Shellcode的变形技术,可以隐藏shellcode中的大量特征,使得使用传统检测引擎的IDS需要更多的CPU时间来检测,同时还存在较高的误报率,这是高速网络上的NIDS所不能接受的。为了使得该引擎更加的通用,需要分析大量的变形引擎,并加入更多的常用指令到符号数组中。
关键词:Shellcode,入侵检测,BP神经网络,变形引擎
1 引言
在信息安全日益被关注的今天,缓冲区溢出攻击无疑是最大的安全威胁之一,严重威胁着大量企事业单位门户网站和内部网络的安全。缓冲区溢出攻击的主要技术就是shellcode技术,包括shellcode的编写和注入。因此,检测缓冲区溢出攻击的主要手段也就是检测流入网络中的数据流中是否包含shellcode。早期的shellcode较简单包含大量的特征,一般的使用特征匹配检测引擎的NIDS都可以较准确的检测出来。为了避免攻击被检测,于是出现了各种针对IDS 的规避手段,使得传统的IDS遭遇了重大考验。其中,Shellcode的变形技术,可以隐藏shellcode中的大量特征,使得使用传统检测引擎的IDS需要更多的CPU时间来检测,同时还存在较高的误报率,这是高速网络上的NIDS所不能接受的。
2 Shellcode及其变形技术
缓冲区是内存中用于存放数据的区域,当程序向缓冲区中填入的数据量超过缓冲区的容量时,就会发生溢出。在许多C或者C++ 编写的程序中,由于未对字符串进行严格的边界检查,将超长字符串拷入函数的栈内时,字符串的溢出会覆盖函数的返回地址,通过精心计算这个覆盖后的返回地址,就能使函数返回后执行恶意代码并操纵系统。Shellcode代码是缓冲区成功溢出后,实现攻击系统的恶意指令集的16进制机器码,它常包含在拷贝进栈内的超长字符串中,一般将此此超长字符串称为shellcode,它包括了三部分:
——空运算符:用无效的单字节或多字节命令来填充字符串,用于精确的返回。
——Shellcode代码:通常为实现攻击功能的代码的等效指令码。
三部分的分布如下图1示:

图1 一般的shellcode组成
由于NIDS 可对简单的Shellcode 进行有效的检测,各种针对传统NIDS 行之有效的Shellcode 变形手法便应运而生。变形的Shellcode在功能上完全等同于变形前原始的Shellcode,但在表现特征上与原始的Shellcode 完全不同。这些变形过的Shellcode 在实施攻击时,它们大都能轻松躲避上述两种传统的Shellcode 检测技术。目前常用的一些生成变形Shellcode 的引擎主要有,ADMmutate,CLET和 Jempiscodes,,当攻击者将原始的Shellcode输入后,引擎能根据不同的设置来生成上百种的变形。Shellcode主要的变形方式有:NOP段变形,返回地址变形和shellcode代码段变形。
2.1 NOP 段的变形
NOP段包含了一些无特定意义的单字节或多字节指令。在溢出成功后要执行shellcode那么必须准确的跳转到shellcode代码段的头部,但是返回地址的不固定性,使得无法保证能精确跳转,错误的跳转意味着攻击的失败。为了扩大攻击的成功率,一个NOP段被放置在Shellcode 段之前,只要返回地址能跳转进入NOP段,指令会顺序的执行直到攻击代码成功实施攻击。
2.2 Shellcode代码段的变形
在shellcode的中存在一些稳定的特征包括一些特定的字符串,例如存在一些shell的名称(./bin/bash,/bin/sh...)。为了避免很容易被检测到,利用病毒常用的多态技术对Shellcode段进行变形以隐藏特征,迷惑一些简单的检测方法。变形后的shellcode就称为多态shellcode,主要的变形方法有编码和变换。
编码是指,每次使用一个随机的密钥对shellcode进行编码,编码算法不用是很复杂的密码算法,因为在高速网络中使用的NIDS有一定的时间和CPU限制,同时被利用的缓冲区的太小也存在限制,所以简单的编码算法就能彻底改变代码的特征,使得NIDS 的特征匹配失效。同时在shellcode 段之前插入一个解码函数,该函数用于在shellcode 段被执行之前对进行解码恢复成原来的可执行代码。编码是最有效的变形方法,这种方法的溢出字符串的结构如下图2:

图2 变形shellcode组成
为了防止对解码引擎进行检测,在更高级的变形技术中,shellcode解码引擎本身也必须进行相当的变形。例如,在解码引擎中随机地插入一些无效的代码;把一条指令能完成的工作用两条或更多的指令代替;随机改变寄存器的使用顺序,打乱寄存器的用途。如果同时引入这三种变形方法,即便是具有相同功能的解码引擎也会拥有截然不同的特征,导致NIDS通过检测Shellcode解码引擎来检测Shellcode变得异常困难。 shellcode段变形过程中有一个必须遵循的原则就是不允许“0x00”字节出现,因为字符串处理函数中以“0x00”作为字符串的结尾标志,若存在“0x00”字节,shellcode可能在字符串复制过程中被截断失效。
变换的方法主要是相同功能指令替换,例如用XOR EAX EAX 替换MOV EAX 0。
2.3 返回地址区的变形
溢出字符串必须覆盖真实的返回地址,一般情况下溢出字符串中的返回地址被多次重复,以便可以准确的覆盖真实的地址。溢出字符串中的返回地址不该被编码或隐藏,因为确切的溢出字符串地址还不能事先确定,一旦变形后的地址值不在NOP 段的范围之内,就会造成攻击的失败,所以对返回地址区的变形最为困难。
目前最有效的变形方法是轻微的改变地址的不重要位即最后一位,但有限的变化并不足以使NIDS 无法辨别出变形后的返回地址区。有些Windows 平台上的Shellcode 利用系统内某些特定地址的jmp esp 指令进行跳转,这种类型的返回地址区几乎无法进行任何形式的变形,因为系统内jmpesp 指令的地址完全固定且相当有限,即使对这些有限的地址进行随机的排列构成返回地址区,NIDS 也能在相当短的CPU 时钟周期内将其检测并发出警报。
1/2 1 2 下一页 尾页 |