缓冲区溢出漏洞实验
缓冲区溢出是指程序试图向缓冲区写入超出预分配固定长度数据的情况。这个漏洞是非常不利的,黑客可以改变程序的流控制,甚至执行代码的任意片段。
实验步骤:
首先要输入一些命令
sudo apt-get update
sudo apt-get install lib32z1 libc6-dev-i386
sudo apt-get install lib32readline-gplv2-dev
安装32位程序。
实验楼提供的是64位Ubuntu linux,而本次实验为了方便观察汇编语句,我用我的电脑环境做了本次实验遇到一些问题,但最后还是成功运行了
Ubuntu和其他一些Linux系统中,使用地址空间随机化来随机堆(heap)和栈(stack)的初始地址。关闭地址空间随机化,以使猜测准确内存地址变得简单。
在输入ln -S zsh sh命令
接下来设置漏洞程序。输入stack.c,编译且设置SET-UID。
GCC编译器有一种栈保护机制来阻止缓冲区溢出,所以我们在编译代码时需要用 –fno-stack-protector 关闭这种机制。-z execstack 用于允许执行栈。
编译exploit.c程序
攻击刚才的漏洞程序,并通过攻击获得root权限,把以下代码保存为“exploit.c”文件
现在我们要得到shellcode在内存中的地址
通过i r $esp找到str地址
再根据语句 strcpy(buffer+100,shellcode);计算shellcode的地址为 0xfffffffdbf0(十六进制)+100(十进制)=0xffffffdc64(十六进制)
修改代码
先运行攻击程序exploit,再运行漏洞程序stack,可见,通过攻击,获得了root权限!
具体步骤已完成,因为我自己用电脑做的,所以是64位,到最后修改代码时多了四比特
遇到的问题以及解决
在输入-m32时出现sys/cdefs.h: No such file or directory错误,我查找了资料发现实验楼是在32位环境中运行的cdefs.h fatal error: sys/cdefs.h: No such file or directory
原因是:使用的是amd64版本的Ubuntu
解决方法:将-m32改为-m64即可[]