|
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