网络通信 频道

windows下生成shell的一种新方法(1)

hell实际上就是一小段可执行程序,有代码段、数据段和堆栈。只不过这段程序在内存中的位置只有在程序执行时才能确定,而在编译时并不能知道,这就给我们的编程带来了不少麻烦,数据不好定位与赋值。UNIX下的jmp、call定位在我的VC上好像不太行;而数据的赋值一般用mov byte ptr[ebp-x],''?''来进行,既麻烦、又浪费间。另外要得到shell的代码,还得用VC中的disassembly命令。那么有没有好一点的办法呢?先看一下下面的程序:

#include <stdio.h>
#include <windows.h>
#include <stddef.h>
void main()
{
char *buff,*data,shell[500];
long off;
int i
__asm
{
mov eax,offset begin
mov buff,eax
mov off,offset end
sub off,eax
}
for(i=0;i<off;i++)
shell=buff;

for(i=0;i<4;i++) //写入偏移值(代码段的大小)
{char ch=(char)(off>>(8*i));
shell[4+i]=ch;
}

//初始化数据段
data=shell+off;
data[0]=0x01;
....

//输出shell
FILE *fp;
fp=fopen("shell","w");
fwrite(shell,off+?,1,fp);
fclose(fp);
return;

//shell
begin://shell开始
__asm{
mov ebp,esp
add ebp,0x11111111 //偏移值

}
end://shell结束
;
}
首先应该注意到,程序没有执行完就return了,后面不被执行的地方就是我们要的shell代码,程序一开始就用一个buff指针指向这里。然后就把buff中的内容移到一个shell数组中,这就是我们要的shell代码段了。off是shell代码段的大小,data=shell+off,即data指向shell代码段之后,这就中数据段了,可以直接用data[x]=?对数据段进行初始化(是不是很方便?)。最后输出shell数组中的内容,就是完整的shell了,输出的格式可以自己定义,这里是以十六进制格式直接输出到一个文件中。

文章转载地址:http://www.cnpaf.net/Class/hack/05121820345035402290.htm
0
相关文章