20165203缓冲区溢出漏洞实验
实验介绍
- 缓冲区溢出是指程序试图向缓冲区写入超出预分配固定长度数据的情况。
- 这一漏洞可以被恶意用户利用来++改变程序的流控制++,甚至执行代码的任意片段。
- 原因:这一漏洞的出现是由于数据缓冲器和返回地址的暂时关闭,溢出会引起返回地址被重写。
实验步骤
1.为了方便观察汇编语句,先安装一些用于编译32位C语言程序的软件包:
输入以下命令:
sudo apt-get update
sudo apt-get install -y lib32z1 libc6-dev-i386
sudo apt-get install -y lib32readline-gplv2-dev
2.取消随机化堆和栈初始地址的功能,这使得猜测准确的内存地址变得十分困难,而猜测内存地址是缓冲区溢出攻击的关键。
输入sudo sysctl -w kernel.randomize_va_space=0
3.设置zsh程序进一步防范缓冲区溢出攻击
输入
sudo su
cd /bin
rm -sh
ln -s zsh sh
exit
4.进入32位linux环境,并设置linux终端
输入
linux 32
/bin/bash
5.设置漏洞程序
- 输入
cd /tmp
vi stack.c
- 输入如下代码,如图所示
- 输入以下命令,编译该程序,并设置SET-UID
sudo su
gcc -m32 -g -z execstack-protector -o stack stack.c
chmod u+s stack
exit
GCC编译器有一种栈保护机制来阻止缓冲区溢出,所以我们在编译代码时需要用 –fno-stack-protector
关闭这种机制。
-z execstack
用于允许执行栈。
6.设置攻击程序
- 为了攻击刚才的漏洞程序,并通过攻击获得 root 权限,建立攻击程序,设立exploit.c文件,输入如下程序。
- 得到shellcode在内存中的地址,进行gdb调试, 如图所示
- 根据图得到地址,并计算出实际地址,根据计算出的实际地址修改exploit.c中的程序。
- 编译程序:
gcc -m32 -o exploit exploit.c
7.攻击并获得root权限
输入:
./exploit-------攻击程序
./stack---------漏洞程序
实验感想
本次实验,我了解了漏洞攻击,开阔了眼界。起初,自己也不太了解缓冲区溢出是什么,自己也是查阅了书籍等各种资料又根据实验楼的教程完成实验,锻炼了自己的耐心,提高了自己的实验能力。