大型计算机变形,ShellCode编码变形大法 -电脑资料
现在的很多有溢出漏洞的程序对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{
temp = ShellCode^Key;
//对一些可能造成shellcode失效的字符进行替换
if(temp<=0x1f|| temp=='.'|| temp=='/'|| temp=='0'|| temp=='?')
{
EnShellCode[k]='0';
++k;
temp+=0x31;
}
EnShellCode[k]=ch;
++k;
}
逆算法F’:
清楚了编码的方法后,那解码的思想也很容易理解,ShellCode编码变形大法》(https://www.unjs.com)。就是判断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,这样也可以大量减少出现非法字符的可能。
这篇文章更多的是对编码算法作一些总结,主要目的还是想起抛砖引玉的作用,如果有更好的办法,希望大家可以一起讨论,一起进步。
大型计算机变形,ShellCode编码变形大法 -电脑资料相关推荐
- 计算机数制编码,计算机编码和数制 -电脑资料
数制数制定义 按进位的原则进行计数,称为进位计数制,简称"数制",生活中经常要用到数制,通常以十进制进行计数,除了十进制计数以外,还有许多非十进制的计数方法.例如,60分钟为1小时 ...
- shellcode中变形bindshell的实现
最近学习<0day安全>一书 记录一下调试编码过程 书中环境XP VC6 本机的环境是server 2008 r2 x64 编译环境是vs2013 第一步: 首先是写一个win c版本的 ...
- 计算机的软件系统可以对硬盘进行,对硬盘损伤最大的六大软件 -电脑资料
对硬盘损伤最大的六大软件 -电脑资料 时间:2019-01-01 [www.unjs.com - 电脑资料] 硬盘是计算机中最重要的存储介质,关于硬盘的维护保养,相信每个电脑用户都有所了解,对硬盘损伤 ...
- shellcode 编码技术
在很多漏洞利用场景中, shellcode 的内容将会受到限制. 例如你不能输入 \x00 这个字符,编辑框不能输入 \x0d \x0a这样的字符 所以需要完成 shellcode 的逻辑,然后使用编 ...
- 计算机合并键功能,Word组合(功能键与Ctrl等组合) -电脑资料
Word组合(功能键与Ctrl等组合) -电脑资料 时间:2019-01-01 [www.unjs.com - 电脑资料] Word快捷键都有哪些?恐怕您目前所掌握的Ctrl+B.Ctrl+E这类的最 ...
- 计算机中常见的英语错误提示,BIOS出错英文提示信息大全 -电脑资料
BIOS出错英文提示信息大全 -电脑资料 时间:2019-01-01 [www.unjs.com - 电脑资料] 第二电脑网收集的BIOS出错英文提示信息大全,对硬件出错的判断非常有用 Drive A ...
- 电脑文件夹加密软件_上海靠谱电脑资料加密软件解决方案
上海靠谱电脑资料加密软件解决方案 m1C0x1j2v 上海靠谱电脑资料加密软件解决方案 的化通常涉及耗时的过程,例如二进制翻译.过后,向该保护区的电磁驱动器发出灭火指令,打开七氟丙烷气瓶,向灭火区进行 ...
- 计算机误删怎么恢复数据,电脑资料数据误删怎么恢复?
原标题:电脑资料数据误删怎么恢复? 电脑上的资料误删怎么恢复?电脑是我们办公学习必备的工具,平时存储在电脑上的资料都是工作中或者学习中的重要资料.这些重要的资料在电脑上被自己误删了该怎么恢复?很多人都 ...
- 电脑资料如何转移到新电脑?教你3种数据迁移技巧
当下,电脑越来越普及,更换频率也越来越高.当我们购买新电脑,需要将旧电脑上的文件资料迁移到新电脑上,方便使用,电脑资料如何转移到新电脑?其实我们完全可以自己解决哦,下面一起来看下电脑资料迁移的具体方法 ...
最新文章
- 支持向量机SVM序列最小优化算法SMO
- 利用NVIDIA-NGC中的MATLAB容器加速语义分割
- js callback promise async await 几种异步函数处理方式
- latex 波浪线_湖熟镇月牙刀波浪刀带哪家好厂家
- linux连接建立的时间,用timedatectl在Linux中检查当前时区及更改时区(创建符号链接来更改时区)...
- 9203-1203-随堂笔记-窗体通讯录
- Yii2的urlManager URL美化
- OpenCV(图像处理)—访问像素的三种方法
- 微信小程序云开发教程-云函数操作数据库-增、查
- 测试了一下人脸识别,远远达不到吾之要求
- Silvaco TCAD LTPS双栅器件仿真收敛不了,有没有好的解决办法
- 32位cpu和64位cpu对内存地址和内存单元的差别
- torch.nn、(二)
- Oracle 11g RAC 修改服务器各类ip地址【转载】
- 决策树(Decision Tree)
- 程序员专业常用英语词汇
- Oracle数据库系统结构一(存储结构)
- 这些年,我与Google不得不说的那些事儿
- 技术人要有一些兴趣爱好
- navicat prenium如何只显示oracle用户自己的表空间
热门文章
- XXTea 加密/解密 字符串
- Bilibili Helper - 哔哩哔哩弹幕网辅助扩展插件
- HDU - 5974 A Simple Math Problem 题解
- 鸿蒙系统开发工具DevEco Studio 2.2下载/安装教程
- linux下载gitlab文件,linux安装gitlab
- C语言循环结构程序(while循环、do while循环、for循环、break终止、continue结束)
- Microchip最新中文资料下载
- 致远互联2021年中报:扎根协同的广阔天地,撸起袖子加油干
- 程序员不爱读书,但这很不明智——想看就看《高效能程序员的修炼》
- [Unity3D]Unity3D游戏开发之仿仙剑奇侠传角色控制效果