基于缓冲区溢出攻击的shellcode编码技术研究

2018-08-31 05:54沈阳理工大学信息科学与工程学院李爱华赵晓雯
电子世界 2018年16期
关键词:编码方法微调缓冲区

沈阳理工大学信息科学与工程学院 高 珊 李爱华 赵晓雯

1 引言

缓冲区是程序运行期间在内存中分配的一个连续的区域。所谓缓冲区溢出,就是向固定长度的缓冲区中写入超出其预告分配长度的内容,从而覆盖了缓冲区周围的内存空间。攻击者要实现缓冲区溢出攻击,一般都要完成下面三个步骤:

(1)构造需要执行的代码shellcode(即缓冲区溢出攻击中植入进程的代码,可用来实现特定攻击或获取权限),并将其放到目标系统的内存;

(2)获得缓冲区的大小和定位溢出点ret的位置;

(3)控制程序跳转,改变程序流程。

对于缓冲区溢出攻击来说,shellcode起到了至关重要的作用。然而在很多漏洞利用场景中,shellcode的内容将会受到限制,通过对其编码可以在一定程度上解决该问题。

2 shellcode常用编码

要想突破重重防护,把shellcode安全送入堆栈,不难想到的一个方法就是给shellcode乔装打扮,让它通过防守再采取行动。首先设计好shellcode,然后使用编码技术对其进行编码,使它达到各种限制要求,最后构造解码程序,在真正的shellcode之前加上几条解码指令。当exploit成功后,首先运行顶端的解码程序,这会将经过编码的shellcode还原成原来的样子,然后再执行。

2.1 异或法

最简单的编码方式莫过于异或运算了,该方法所依据的原理是一个数与另一个数做两次异或运算,得到的还是它本身,即A xor B xor B=A。可以通过编程让shellcode逐个字节地与某个特定数据(key)做异或运算,使shellcode的内容符合要求。

在编码时需注意以下几点:

(1)在选取key时,不要选择shellcode中已有的字节,这样会导致NULL字节的出现;

(2)可以选择多个key对shellcode的不同区域分别进行编码;

(3)可以对shellcode进行多轮次的编码。

2.2 微调法

有时shellcode或者解码指令中只是有个别非法字符,那么可以采用微调法。它就是在不影响指令原本功能的情况下,对不符合要求的指令进行等价替换。例如:攻击IIS的shellcode里不能有0x20,如果想要实现将ebx的值减去0x20,可有两种不同的表达方式,一种是直接表示成mov ebx 20h,另一种是采用微调法表示成mov ebx 32h;sub ebx 12h,这两种不同的表达方式实现的功能是相同的,但是第二种方式避免了在代码中出现0x20。

2.3 字符拆分法

字符拆分法是把shellcode中的字符拆分成其他几个符合要求的字符,然后在解码的时候,再将字符合起来,恢复成原来的shellcode。

第一种拆分法是把shellcode中的字符拆分成若干个数字的和,这样一来就会有很多种拆分方式,可以避免一些限制字符。例如:可将0x20拆分成0x03+0x05+0x06+0x06,解码时从头开始每4个字节一相加,这样就又恢复为原来的shellcode。

第二种拆分法是乘积的拆分法,举例来说就是在编码时把0xAB拆分成0xA和0xB,解码时通过0xA*0x10+0xB=0xAB来恢复。

3 shellcode编码设计及实现

3.1 改进的shellcode编码设计

以上介绍的几种shellcode编码方法各有所长,但在实际应用中仅仅选择其中某种编码方法,很难达到要求。对此本文提出一种将异或法与微调法相结合的编码方法。异或法最大的优点就是编码和解码都比较简单,可以有效的避开一些限制字符,但该方法有一定的适应性,比如在经过一次或几次异或编码之后可能仍存在非法字符,或者解码指令decode本身就存在非法字符,这时再采取异或法改变key值是解决不了问题的,可以结合微调法对shellcode或解码程序中仅有的几个非法字符作调整以满足要求。

3.2 shellcode编码实现

以win2000中文版SP3下开DOS窗口的shellcode为例。由于shellcode中有”x00”,所以首先通过自己编写的编码器对shellcode进行编码,异或0x97,这样得到的enshellcode中就不含有”x00”了,执行效果如图1所示。

图1 获得enshellcode结果图

编码之后还需要编写一段解码程序decode,其对应的汇编代码如下:

jmp decode_end //获取enshellcode的地址

decode_start:

pop edx

dec edx

xor ecx,ecx

mov ecx,0x200 //enshellcode的长度0x200足够

decode_loop:

xor byte ptr[edx+ecx],0x97 //解码时的key也为0x97

loop decode_loop //循环实行解码操作

jmp decode_ok //解码完毕

decode_end:

call decode_start

decode_ok: //后面接enshellcode

然后可得到decode的机器码为:“xEBx10x5Ax4Ax33xC9x66xB9x00x02x80x34x0Ax97xE2xFAxEBx05xE8xEBxFFxFFxFF"。此时,发现decode中有”x00”,但是再使用异或法改变key值是解决不了问题的。这种情况就需要结合其他的方法,可以选择微调法。经分析这是由于汇编代码中有”0x200”,那么可将其改为”0x201”,就没有”x00”了。

最后把decode和enshellcode一起送入装载器测试,结果如图2所示。

图2 执行结果图

4 测试结果分析

在上述的例子中,首先通过异或法对shellcode编码起到了避免截断的效果,之后却发现解码指令decode中还存在不合法字符,这种情况使用异或法改变key值是解决不了问题的,不仅会降低编码效率,还会影响shellcode的执行效果。这时结合微调法将decode稍作修改便符合要求了。结果表明这种经过改进的编码方法能够实现shellcode的有效性,提高编码效率。

5 小结

基于缓冲区溢出攻击研究了几种shellcode的编码方法,分析了异或法、微调法、字符拆分法各自的编码特点。在此基础上,提出了一种将异或法与微调法相结合的shellcode编码方法以提高编码效率。

给出改进的shellcode编码设计及实现,并对测试结果进行了分析,测试结果表明此shellcode编码实现了植入代码的准确性及有效性,对缓冲区溢出攻击的防御研究具有一定的参考价值。

猜你喜欢
编码方法微调缓冲区
乐海乐器“微调轴”研发成功
可变摩擦力触感移动终端的汉语盲文编码设计
基于网络聚类与自适应概率的数据库缓冲区替换*
嫩江重要省界缓冲区水质单因子评价法研究
灵活易用,结合自动和手动微调达到好效果 StormAudio ISP 3D.16 ELITE/PA 16 ELITE
毫米波大规模MIMO系统中低复杂度混合预编码方法
关键链技术缓冲区的确定方法研究
隐显结合 听读辩证——高职高专听读模式教学方法与实践的总结、理论适用及模式微调
一种新的星载InSAR直接地理编码方法
浅析公路工程物资的分类及编码方法