现在的很多有溢出漏洞的程序对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编码变形大法 -电脑资料相关推荐

  1. 计算机数制编码,计算机编码和数制 -电脑资料

    数制数制定义 按进位的原则进行计数,称为进位计数制,简称"数制",生活中经常要用到数制,通常以十进制进行计数,除了十进制计数以外,还有许多非十进制的计数方法.例如,60分钟为1小时 ...

  2. shellcode中变形bindshell的实现

    最近学习<0day安全>一书 记录一下调试编码过程 书中环境XP VC6 本机的环境是server 2008 r2 x64  编译环境是vs2013 第一步: 首先是写一个win c版本的 ...

  3. 计算机的软件系统可以对硬盘进行,对硬盘损伤最大的六大软件 -电脑资料

    对硬盘损伤最大的六大软件 -电脑资料 时间:2019-01-01 [www.unjs.com - 电脑资料] 硬盘是计算机中最重要的存储介质,关于硬盘的维护保养,相信每个电脑用户都有所了解,对硬盘损伤 ...

  4. shellcode 编码技术

    在很多漏洞利用场景中, shellcode 的内容将会受到限制. 例如你不能输入 \x00 这个字符,编辑框不能输入 \x0d \x0a这样的字符 所以需要完成 shellcode 的逻辑,然后使用编 ...

  5. 计算机合并键功能,Word组合(功能键与Ctrl等组合) -电脑资料

    Word组合(功能键与Ctrl等组合) -电脑资料 时间:2019-01-01 [www.unjs.com - 电脑资料] Word快捷键都有哪些?恐怕您目前所掌握的Ctrl+B.Ctrl+E这类的最 ...

  6. 计算机中常见的英语错误提示,BIOS出错英文提示信息大全 -电脑资料

    BIOS出错英文提示信息大全 -电脑资料 时间:2019-01-01 [www.unjs.com - 电脑资料] 第二电脑网收集的BIOS出错英文提示信息大全,对硬件出错的判断非常有用 Drive A ...

  7. 电脑文件夹加密软件_上海靠谱电脑资料加密软件解决方案

    上海靠谱电脑资料加密软件解决方案 m1C0x1j2v 上海靠谱电脑资料加密软件解决方案 的化通常涉及耗时的过程,例如二进制翻译.过后,向该保护区的电磁驱动器发出灭火指令,打开七氟丙烷气瓶,向灭火区进行 ...

  8. 计算机误删怎么恢复数据,电脑资料数据误删怎么恢复?

    原标题:电脑资料数据误删怎么恢复? 电脑上的资料误删怎么恢复?电脑是我们办公学习必备的工具,平时存储在电脑上的资料都是工作中或者学习中的重要资料.这些重要的资料在电脑上被自己误删了该怎么恢复?很多人都 ...

  9. 电脑资料如何转移到新电脑?教你3种数据迁移技巧

    当下,电脑越来越普及,更换频率也越来越高.当我们购买新电脑,需要将旧电脑上的文件资料迁移到新电脑上,方便使用,电脑资料如何转移到新电脑?其实我们完全可以自己解决哦,下面一起来看下电脑资料迁移的具体方法 ...

最新文章

  1. 支持向量机SVM序列最小优化算法SMO
  2. 利用NVIDIA-NGC中的MATLAB容器加速语义分割
  3. js callback promise async await 几种异步函数处理方式
  4. latex 波浪线_湖熟镇月牙刀波浪刀带哪家好厂家
  5. linux连接建立的时间,用timedatectl在Linux中检查当前时区及更改时区(创建符号链接来更改时区)...
  6. 9203-1203-随堂笔记-窗体通讯录
  7. Yii2的urlManager URL美化
  8. OpenCV(图像处理)—访问像素的三种方法
  9. 微信小程序云开发教程-云函数操作数据库-增、查
  10. 测试了一下人脸识别,远远达不到吾之要求
  11. Silvaco TCAD LTPS双栅器件仿真收敛不了,有没有好的解决办法
  12. 32位cpu和64位cpu对内存地址和内存单元的差别
  13. torch.nn、(二)
  14. Oracle 11g RAC 修改服务器各类ip地址【转载】
  15. 决策树(Decision Tree)
  16. 程序员专业常用英语词汇
  17. Oracle数据库系统结构一(存储结构)
  18. 这些年,我与Google不得不说的那些事儿
  19. 技术人要有一些兴趣爱好
  20. navicat prenium如何只显示oracle用户自己的表空间

热门文章

  1. XXTea 加密/解密 字符串
  2. Bilibili Helper - 哔哩哔哩弹幕网辅助扩展插件
  3. HDU - 5974 A Simple Math Problem 题解
  4. 鸿蒙系统开发工具DevEco Studio 2.2下载/安装教程
  5. linux下载gitlab文件,linux安装gitlab
  6. C语言循环结构程序(while循环、do while循环、for循环、break终止、continue结束)
  7. Microchip最新中文资料下载
  8. 致远互联2021年中报:扎根协同的广阔天地,撸起袖子加油干
  9. 程序员不爱读书,但这很不明智——想看就看《高效能程序员的修炼》
  10. [Unity3D]Unity3D游戏开发之仿仙剑奇侠传角色控制效果