设为首页 收藏本站
查看: 1482|回复: 0

【安全健行】(5):shellcode编码

[复制链接]

尚未签到

发表于 2015-12-15 14:57:12 | 显示全部楼层 |阅读模式

2015/5/19 18:08:45
上一节我们介绍了基本shellcode的编写,采用的是exit()、setreuid()和execve()三个系统调用,实际中当然是根据自己的需要来选择合适的系统调用了,系统调用号需要查看syscalltable,参数的压入也是采取类似的方式,处理好堆栈,编写汇编代码并不十分困难。
这一节我们要来介绍下shellcode的编码,那么为什么要对shellcode进行编码呢?大致原因有以下几个:

  • 避免出现Bad字符,如\x00、\xa9等;
  • 避开IDS或其他网络检测器的检测;
  • 遵循字符串过滤器;
接下来,我们来简单介绍一种shellcode编码的方式。
一、简单的XOR编码
计算机中一种常见的位运算是XOR运算,即“按位异或”。当初自己记忆这个运算时还费了一些功夫才和“按位与|或”运算区分开。异或运算的本质是判断对应二进制位是否相同,若不同-->异-->True;若相同-->同-->False。因此可以说XOR运算是判断对应二进制位不同的运算
XOR运算有着很好的运算特性,即一个数与一个数XOR两次会得到自身:

0 XOR 0 = 0
0 XOR 1 = 1
1 XOR 1 = 0
1 XOR 0 = 1
101 XOR 100 = 001
001 XOR 100 = 101
我们利用这个特点可以构造shellcode编码和基本的加密,当然,密钥(上例中的0x100)自然要硬编码进shellcode了。
二、JMP/CALL XOR解码器
既然对shellcode编码,那么也就意味着要解码。我们的模型大概是下面的样子:

[decoder][encoded shellcodes]
一般来说,如果解码器需要知道自己的位置,这样就可以计算出编码的shellcode的位置开始解码。确定解码器位置通常被称作GETPC,方法有许多种,今天我们来介绍其中的一种:JMP/CALL
JMP/CALL的思想是:

  • JMP指令跳转到CALL指令;
  • 该CALL指令位于编码的shellcode之前;
  • CALL指令会创建一个新栈,因此将当前的EIP指针压栈(即编码shellcode的起始地址);
  • CALL调用的过程将压栈的地址弹出保存到寄存器中;
  • 利用保存的寄存器进行shellcode解码;
  • JMP到shellcode处执行;
看起来复杂,我们看看下面的汇编代码就明白了,注意每条汇编语句后的执行顺序标号,可以帮助大家理解整个流程:

global _start

_start:
jmp short call_point    ;1. JMP to CALL

begin:
pop esi                 ;3.将栈中的shellcode地址弹出保存到寄存器esi中便于后续解码
xor ecx, ecx            ;4.清空ecx
mov cl, 0x0             ;5.shellcode长度设为0

short_xor:
xor byte[esi], 0x0      ;6.0x0是这里的编码key
inc esi                 ;7.ESI指针递增,遍历所有的shellcode字节
loop short_xor          ;8.循环直到shellcode解码完毕

jmp short shellcodes    ;9.跳过CALL直接到达shellcode段

call_point:
call begin              ;2.CALL begin过程,同时将当前的EIP即shellcode的起始地址压入栈中

shellcodes:             ;10.执行解码后的shellcode

这里放置解码后的shellcode
整体的流程就是这样,只要仔细留心逻辑顺序和shellcode地址的压栈弹栈,JMP/CALL并不难理解。
Refer: Gray Hat Hacking: The Ethical Hacker's Handbook, Third Edition

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-151639-1-1.html 上篇帖子: 【安全健行】(3):Shellcode基础 下篇帖子: 【安全健行】(4):揭开shellcode的神秘面纱
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表