| 网站首页 | 资讯 | Hack | 漏洞 | 网管 | 编程 | 培训 | 品黑页 | 软件 | 论坛 | 动画 | 视频 | 经典 | 教学站 | 黑客点睛 | 
服务导航 我要发布 主力频道 空间域名 精华收集 服务器出租 黑客培训 光盘刻录 特色服务 解决方案 我要投诉
您现在的位置: 华夏黑客同盟 >> Hack >> 牧马天地 >> 正文 用户登录 新用户注册
ShellCode编码变形大法         ★★★ 【字体:
ShellCode编码变形大法
作者:未知 文章来源:华盟收集 点击数: 更新时间:2006-10-10

 

现在的很多有溢出漏洞的程序对ShellCode都有特定的要求,一类是对ShellCode的长度大小有限制;另一类就是不能出现某些特殊字符,比如Cmail漏洞不能有大写字母啊,Foxmail不能有0x2E,0x2F字符一类的。在这里不讨论长度限制的情况,而是讨论一下如何避免特殊字符。
要ShellCode避免出现特殊字符,有两种方法:一种是编写好ShellCode后,对不合要求的字符进行指令等价变换。比如,一些IIS漏洞里面不能出现0x20,对指令Mov eax, 20h,就可以改为Mov eax, 24h;sub eax, 04h;这样来避免出现0x20。这种等价变换法对有少量字符限制的情况比较实用,但如果限制的字符较多,这种方法就比较困难了。
另一种就是把代码分成两块,第二块是EnShellCode,即编过码后的ShellCode,完成我们想要功能比如开端口,反向连接的ShellCode有不合法的字符,所以我们利用一定的算法,把初始的ShellCode进行一定的变换编码,变成合法的EnShellCode后放在第二块,而第一块是完成解码的Decode,其功能是把EnShellCode重新变回初始的ShellCode后,再跳过去执行。

当然Decode和EnShellCode里面不能有非法的字符,否则变换就失去了意义。在这篇文章里,主要讨论算法F的变换,和逆算法F’在Decode里的实现。

NO1:XOR大法
XOR是指按位异或,其运算规则是相同为0,不同为1,即:
0 xor 0 = 0
0 xor 1 = 1
1 xor 0 = 1
1 xor 1 = 0
根据运算规则,我们可以推出对于某个值X,密钥Key,有如下等式成立:
X xor Key = Z Z xor Key = X ====> X xor Key xor Key = X
即一个值对同一个数,异或两次后,得到的结果为其原值。我们可以利用该性质,来实现变换算法F和逆算法F’。
变换算法F: 算法很简单,我们把ShellCode数组里的每一个字符ShellCode,与某一密钥Key作异或,就得到EnShellCode,保存在EnShellCode数组中。这里令密钥Key为0x97,当然也可以改成其它值:

逆算法F’:
Decode中要把EnShellCode重新变回ShellCode,根据上面的分析,只需要将EnShellCode里面的字符,再异或编码时的Key就可以了,所以也比较简单。实现的汇编代码如下:
jmp Decode_end
Decode_start:
pop edx // 得到解码开始位置 esp -> edx
dec edx
xor ecx,ecx
mov cx,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:
我们把上面的汇编转换成机器码,就得到了Decode的代码;然后在后面附上EnShellCode的代码,就得到了完整的部分了。
小结:
Xor大法是最早使用,同时也是现在最常见的编码方法。它最大的好处是编码和解码都比较简单,而且也可以避开一定的字符,比如ASCII为0的字符,通常ShellCode是以字符串形式传送过去,为0的字符会被认为是字符串的结束标志而导致截断后面的字符;而用Xor方法经过编码后,为0的字符就会被编码成其他的值,从而避免被截断。
该方法也有一定适应性,如果ShellCode异或某个Key后还有非法字符,可以尝试改变Key的值,直到完全合法为止。
当然,这种方法的缺点也很明显,当限制字符较多,或限制字符是一个较大的范围的时候,那很有可能找不到合适的Key来符合限制要求。在这种情况下,我们就需要用其他的算法来实现编码和解码了。

NO2:直接替换法
我们在编码的时候,先对每一个字符都进行异或编码。如果某个字符异或后,还是非法字符,则再单独对该字符进行处理,变换成合要求的字符,这就是直接替换法。该方法最早可以在Yuange的文章中看到。
变换算法F:
其思想是ShellCode的每一个字符ShellCode先和Key作异或得到Temp,如果合法,就直接将Temp保存在EnShellCode当中;如果不合法,则将EnShellCode存为‘0’,而把EnShellCode[i+1]存为temp+‘0’。算法示意图如下图3所示:

这里‘0’只是一个标志,我们遇到了‘0’,就知道这里只是个标志,后面一位才是真正的ShellCode,减去‘0’后就可以恢复原来的值。当然我们也可以把‘0’换成其他的字符,这里只是一种思想。其实现代码如下:
int nShellCodeLen = strlen(ShellCode);
k = 0;
for(i=0;i<nShellCodeLen;++i)
{
temp = ShellCode^Key;
//对一些可能造成shellcode失效的字符进行替换
if(temp<=0x1f|| temp=='.'|| temp=='/'|| temp=='0'|| temp=='?')
{
EnShellCode[k]='0';
++k;
temp+=0x31;
}
EnShellCode[k]=ch;
++k;
}

逆算法F’:
清楚了编码的方法后,那解码的思想也很容易理解。就是判断EnShellCode的每个字符,如果不是‘0’,就直接异或Key变回去;如果是‘0’,就把后面的那个字符减去‘0’后再异或Key,就这样恢复以前的ShellCode。实现的汇编代码如下:
jmp Decode_end
Decode_start:
pop edi
push edi
pop esi
xor ecx,ecx
Decode_loop:
Lodsb
cmp al,cl
jz Decode_ok
cmp al,0x30 //判断是否为标志’0’
jz special_char_clean //如果是,就跳去特殊字符处理
store:
xor al, key
stosb //保存解码后的ShellCode
jmp Decode_loop
special_char_clean: //特殊字符处理,把后一位字符减去0x31,就恢复原来的值
lodsb
sub al,0x31
jmp store
Decode_end:
call Decode_start
Decode_ok: //其余真正加密的shellcode代码会连接在此处
同样,我们把上面的汇编转换成机器码,就得到了Decode的代码,然后在后面附上EnShellCode的代码,就得到了完整的代码了。

小结:
该方法十分巧妙,灵活的运用可以解决很多字符限制的问题,比如对Cmail就可以把不合规范的大写字母减去一个值变成小写字母,当然在前面放上一个标志;解码的时候看见这个标志,就把后面的字母加上那个值,从而得到了恢复。
Decode的代码本身就需要是合法的字符。如果有些不合要求的字符,可以采用微调的方式,使其符合限制条件。如果微调无效,那就需要采用其他的算法了。


NO3:拆分法
这种方法是F.zh在《黑客防线》第8期上提出的,他的思路是把ShellCode拆分成几个数字的和,由于和的组合方式有很多种,所以可以避免大量的ASCII字符;他还提到,在32位的计算机上,每四个字节处理比较方便,所以最好拆分成4个数字的和。即:
ShellCode = w + x + y + z
这个思想有相当的创造性,So Cool!如果有什么不明白,可以仔细看看第8期防册的《定制特殊的ShellCode之一》一文。
变换算法F:
把ShellCode取出来,穷举下所有的求和组合的情况,如果一个组合可以满足不包含任何的限制字符,那该拆分就是合法的,就把它保存为EnShellCode,然后再考虑ShellCode的下一位ShellCode[i+1],直到所有ShellCode字符拆分完毕。我们就得到了符合限制条件的EnShellCode。实现代码……呵呵,还是请参看原文吧。
逆算法F’:
也很简单,就是得到EnShellCode的头后,依次取四个字节相加,然后放入内存。F.zh在原文中也给出了Decode的汇编代码,很清晰,建议大家好好看看。
小结:
是种不错的方法,而且其创新思维也值得我们学习,实在是Cool弊了!


其它算法简介
从上面几种方法的介绍应该可以看出,其实只要满足下面条件的算法F和逆算法F’,都可以用于编码变换ShellCode。

所以只要有好的算法和符合编码限制的实现,都可以用于ShellCode的编码。在实际中,还有一些使用过的编码算法有:Yuange在《Widechar的字符串缓冲溢出攻击技术》中提出来的,把ShellCode=0xAB = A*0x10+B的进行拆分,恢复就用0xA*0x10+0xB=0xAB。这个算法在Webdav漏洞攻击的时候得到了广泛的运用。算法的代码,可以参看yuange和isno的文章。还有F.zh提到的,Xor一个4字节的数字,比如0x123456,这样也可以大量减少出现非法字符的可能。
这篇文章更多的是对编码算法作一些总结,主要目的还是想起抛砖引玉的作用,如果有更好的办法,希望大家可以一起讨论,一起进步。

责任编辑:华夏编辑8  联系方式  Email:华夏编辑8
电话:51228163
  • 上一篇黑客:

  • 下一篇黑客:
  • (只显示最新5条。评论内容只代表网友观点,与本站立场无关!)
    姓 名:
    * 游客填写  ·注册用户
    主 页:
    评 分:
    1分 2分 3分 4分 5分
    评论内容:
    验证码: *
  • 请遵守《互联网电子公告服务管理规定》及中华人民共和国其他各项有关法律法规。
  • 严禁发表危害国家安全、损害国家利益、破坏民族团结、破坏国家宗教政策、破坏社会稳定、侮辱、诽谤、教唆、淫秽等内容的评论 。
  • 用户需对自己在使用本站服务过程中的行为承担法律责任(直接或间接导致的)。
  • 本站管理员有权保留或删除评论内容。
  • 评论内容只代表网友个人观点,与本网站立场无关。
  • 最新hack更新
    最新推荐资讯
    相关黑客
    flash漏洞用shellcode的分析
    一次Shellcode跟踪实例
    shellcode绕过kav6
    URL编码与SQL注入
    Shellcode Backdoor的简单测试
    PostgreSQL多字节字符编码SQL注入
    “冲击波”病毒的shellcode
    BASE64编码规则及C#实现
    利用URL编码进行加密 [源码]
    绕过堆栈保护 编写shellcode
    最新会员软件
    最新推荐视频
    最新推荐动画

    Copyright @ 2005 77169.Net Inc. All rights reserved. 华夏黑客同盟 版权所有
    北京市电信通提供网络带宽

    mailto:webmaster@77169.net
    咨询QQ号:836982 / 59280880
    联系站长 QQ38588913
    热线电话: 86-10-67634029/676229433
    京ICP证041431号