5.2.2 编码——异或97
“有了思路,算法和实现就很简单了。我们把ShellCode数组里的每一个字符ShellCode[i]与某一密钥Key作异或,就得到了编码后的enShellCode,保存在enShellCode数组中。”
“在C语言中,异或操作符是‘^’,这里我们选Key为0x97。如果ShellCode里面有‘0x00’,和0x97异或后,就会变为0x97,编码后的enShellCode就不会被截断了。”
“那如果ShellCode中有0x97呢?岂不是和Key异或反而变为0,被截断了?”宇强想得很远。
“这个完全有可能!那时我们就只能把Key改成其他值试试了。”老师说道,“思路都是一样的,我们看看编码代码吧!”
#include <string.h>
#include <stdio.h>
#define KEY 0x97
unsigned char ShellCode[] = "\x41\x00\x42\x43"; //含有\x00的ShellCode
int main()
{
int i;
int nLen;
unsigned char enShellCode[500]; //编码后的enShellCode
nLen = sizeof(ShellCode)-1; //获得ShellCode的长度
for(i=0; i<nLen; i++)
{
enShellCode[i] = ShellCode[i] ^ KEY; //对每一位ShellCode作xor key编码
printf("\\x%x-",ShellCode[i]);
printf("\\x%x ",enShellCode[i]); //打印出效果
}
return 0;
}
“这里我们测试用的ShellCode中含有0x00,但编码后得到的enShellCode就不会有了。我们运行,其效果如图5-3。”
“0x41变为d6,0x00变为97!果然达到效果了!”同学们说道。
“明白了编码,大家就来看看解码吧!”