Chinaunix首页 | 论坛 | 博客
  • 博客访问: 159678
  • 博文数量: 34
  • 博客积分: 2070
  • 博客等级: 大尉
  • 技术积分: 277
  • 用 户 组: 普通用户
  • 注册时间: 2010-02-26 19:29
文章分类
文章存档

2015年(2)

2014年(4)

2013年(1)

2012年(1)

2011年(5)

2010年(21)

我的朋友

分类: 网络与安全

2010-07-26 10:40:47

基本原理:
1:把我们的shellcode提供给他,让他可以访问shellcode。   
2:修改他的返回地址为shellcode的入口地址。

编写一个开启Shell的函数:

shellcode.
  ------------------------------------------------------------------------ 
  #include 
  void main() { 
  char *name[2]; 
  name[0] = "/bin/sh" 
  name[1] = NULL; 
  execve(name[0], name, NULL); 
  }


利用他人使用strcpy等无边界检查的函数,将这段shellcode.c的二进制数据保存到拥有SID程序的buffer内,使包含buffer的函数返回地址被覆盖,指向buffer中的shellcode入口地址,这样我们就获得了一个拥有root权限的Shell。

我们知道,对于操作系统来说,一个shell下的每一个程序的堆栈段开始地址都是   
相同的   
。我们可以写一个程序,获得运行时的堆栈起始地址,这样,我们就知道了目标程   
序堆栈   
的开始地址。   

下面这个函数,用eax返回当前程序的堆栈指针。(所有C函数的返回值都放在eax   
寄存器   
里面):   
------------------------------------------------------------------------   
------   
unsigned long get_sp(void) {   
__asm__("movl %esp,%eax");   
}   
------------------------------------------------------------------------   
------   

我们在知道了堆栈开始地址后,buffer相对于堆栈开始地址的偏移,是他程序员自己写出来的程序决定的,我们不知道,只能靠猜测了。

对于远程使用者,我们传过去的shellcode就必须负担起打开一个socket,   
然后   
listen我们的连接,给我们一个远程shell的责任。   
如何开一个远程shell呢?我们先申请一个socketfd,使用30464(随便,多少都行   
)作为   
这个socket连接的端口,bind他,然后在这个端口上等待连接listen。当有连接进   
来后,   
开一个子shell,把连接的clientfd作为子shell的stdin,stdout,stderr。这样,   
我们   
远程的使用者就有了一个远程shell(跟telnet一样啦)

原文地址:





阅读(3940) | 评论(0) | 转发(0) |
0

上一篇:硬盘知识

下一篇:Linux 的 库(转载)

给主人留下些什么吧!~~