软件漏洞-ShellCode加解密

软件漏洞-ShellCode加解密

ShellCode应该尽量避免大量的00,要解决这个问题需要对shellcode进行编码

shellcode的编码

shellcode的编码必须要可逆,不然怎么返回执行呢

所以直接用异或xor来处理

假设用 xor a,b来处理

a是我们的shellcode b是什么设置的key一个值

但是这个值要确保一个问题就是这个key和任何值进行异或

都会结果不为0,而且我们的a是一个字节,这个key也得是一个字节

范围为0~FF

找key

对shellcode每一个进行xor a,b 然后b从0-0xff和每一个shellcode进行异或来判断是否为0x00,如果没有一个为0x00,则就是这个为key值

 

int GetKey()
{
int size = sizeof(shellcode) / sizeof(char);
int flag = 1;
int temp;
for (int j = 0x00; j <= 0xFF; j++)
{
for (int i=0x00; i < 0x44; i++)
{
temp = shellcode[i] ^ j;
if (temp == 0)
{
flag == 0;
break;
}
}
if (flag == 1)
{
cout << "k == " << j << endl;
return j;
}
}
return 0;
}
?

找到key之后再进行复制到新的数组里面,也可以一边找一边赋值 会快点

int GetKey()
{
int size = sizeof(shellcode) / sizeof(char);
unsigned char* EnCodeBuff = new unsigned char[size];
int flag = 1;
int temp;
for (int j = 0x00; j <= 0xFF; j++)
{
flag = 1;
for (int i=0x00; i < 0x44; i++)
{
EnCodeBuff[i] = shellcode[i] ^ j;
if (EnCodeBuff[i] == 0)
{
break;
flag = 0;
}
}
}
if (flag == 0)
{
cout << "Encode失败 没有合适的key" << endl;
}
else
{
cout << "Encode 成功" << endl;
}
return 0;
}
?

使用文件来保存编码后的shellcode

    FILE* fp;
fopen_s(&fp, "encode.txt", "w+");
fprintf(fp,"nkey========0x%0.2x\n",nkey);
fprintf(fp, "\\\n\"", nkey);
for (int i = 0; i < size; i++)
{
fprintf(fp, "\\x%0.2X", EnCodeBuff[i]);
if (i % 12 == 0)
{
fprintf(fp, "\"\\\n\"");
}
}
fprintf(fp, "\"");
fclose(fp);
delete[] EnCodeBuff;

ShellCode解码

ShellCode编号后,肯定要再ShelloCode前面有一段解码

由于不知道Shellocde的具体地址,所有需要根据偏移量来计算shellcode,需要获取当前的eip的指来处理

获取当前eip值的办法

软件漏洞-ShellCode加解密

 

 

        xor eax,eax
call tag_get_eip-1
tag_get_eip-1:
retn
pop eax

这样eax返回的就是tag_get_eip-1的地址,然后利用偏移就可以得到shellcode 的地址了

解码

解码的话直接再用xor变回来就好了

软件漏洞-ShellCode加解密

上一篇:Linux操作系统常用命令


下一篇:解决m1 MacBook没有我的照片流功能