缓冲区溢出漏洞实验
一、实验简介
缓冲区溢出是指程序试图向缓冲区写入超出预分配固定长度数据的情况。这一漏洞可以被恶意用户利用来改变程序的流控制,甚至执行代码的任意片段。这一漏洞的出现是由于数据缓冲器和返回地址的暂时关闭,溢出会引起返回地址被重写。
二、实验内容
0.相关说明
本次实验在32为Linux下进行,如果操作系统为64位,需要按照如下方法设置。实验使用的shell脚本为zsh。
sudo apt-get update
sudo apt-get install lib32z1 libc6-dev-i386
sudo apt-get install lib32readline-gplv2-dev
ln -s /bin/zsh /bin/sh
Linux系统中,使用地址空间随机化来随机堆(heap)和栈(stack)的初始地址,这使得猜测准确的内存地址变得十分困难,而猜测内存地址是缓冲区溢出攻击的关键。为了实验可以有效进行,我们需要关闭地址空间随机化。
sudo sysctl -w kernel.randomize_va_space=0
1.shellcode
Shellcode实际是一段代码(也可以是填充数据),是用来发送到服务器利用特定漏洞的代码,一般可以获取权限。另外,Shellcode一般是作为数据发送给受攻击服务器的。 Shellcode是溢出程序和蠕虫病毒的核心,提到它自然就会和漏洞联想在一起,毕竟Shellcode只对没有打补丁的主机有用武之地。漏洞利用中最关键的是Shellcode的编写。由于漏洞发现者在漏洞发现之初并不会给出完整Shellcode,因此掌握Shellcode编写技术就显得尤为重要。
2.一个带有缓冲区溢出漏洞的程序
下面是一个带有缓冲区溢出漏洞的程序。程序的功能是,从文件中一个长度为517的字符数组,调用带有漏洞的函数,将长度为517的字符串存储在长度为12的数组中,这一操作将导致缓冲区溢出,致使存储函数返回地址的栈空间被写入str中的值,函数不能正常返回。
//stack.c
/* This program has a buffer overflow vulnerability. */
/* Our task is to exploit this vulnerability */
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
int bof(char *str)
{
char buffer[12];
/* The following statement has a buffer overflow problem */
strcpy(buffer, str);
return 1;
}
int main(int argc, char **argv)
{
char str[517];
FILE *badfile;
badfile = fopen("badfile", "r");
fread(str, sizeof(char), 517, badfile);
bof(str);
printf("Returned Properly\n");
return 1;
}
使用su用户编译程序,关闭堆栈保护,允许执行栈。设置Set-UID权限。
gcc -m32 -g -z execstack -fno