软件漏洞-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值的办法
![](https://img2020.cnblogs.com/blog/1940490/202104/1940490-20210405001828945-875454309.png)
xor eax,eax
call tag_get_eip-1
tag_get_eip-1:
retn
pop eax
这样eax返回的就是tag_get_eip-1的地址,然后利用偏移就可以得到shellcode 的地址了
解码