缓冲区溢出漏洞实验 20199321

缓冲区溢出漏洞实验

缓冲区溢出是指程序试图向缓冲区写入超出预分配固定长度数据的情况。这一漏洞可以被恶意用户利用来改变程序的流控制,甚至执行代码的任意片段。这一漏洞的出现是由于数据缓冲器和返回地址的暂时关闭,溢出会引起返回地址被重写。

缓冲区溢出漏洞实验的实验楼环境有问题,使用格式化字符串漏洞实验环境,并额外安装gdb。

实验准备

  • 输入命令安装一些用于编译 32 位 C 程序的软件包
sudo apt-get install gdb
sudo apt-get update
sudo apt-get install -y lib32z1 libc6-dev-i386
sudo apt-get install -y lib32readline-gplv2-dev
  • 关闭使用地址空间随机化来随机堆(heap)和栈(stack)的初始地址功能
sudo sysctl -w kernel.randomize_va_space=0
  • 设置 zsh 程序
sudo su
cd /bin
rm sh
ln -s zsh sh
exit
  • 输入命令“linux32”进入32位linux环境,输入“/bin/bash”使用bash

漏洞程序

  • 在 /tmp 目录下新建一个 stack.c 文件,程序会读取一个名为“badfile”的文件,并将文件内容装入“buffer”。
  • 编译该程序,并设置 SET-UID。
sudo su
gcc -m32 -g -z execstack -fno-stack-protector -o stack stack.c
chmod u+s stack
exit

攻击程序

  • 在 /tmp 目录下新建一个 exploit.c 文件

  • 我们要得到 shellcode 在内存中的地址,输入命令

  • 设置断点

  • 根据 strcpy(buffer + 100,shellcode); 修改 exploit.c 程序,然后编译

  • 先运行攻击程序 exploit,再运行漏洞程序 stack,观察结果

  • 攻击失败,提示”段错误“,发现地址需要自己根据实际情况自行计算

  • 重新计算地址,更改exploit.c文件重新编译。计算 shellcode 的地址为 0xffffcdd0(十六进制) + 0x64(100的十六进制) = 0xffffce34(十六进制)

  • 重新进行攻击,成功

实验总结

据语句 strcpy(buffer + 100,shellcode); 我们计算 shellcode 的地址。际操作中的地址和实验楼实例的地址可能不一样,需要根据实际输出的结果来计算。一般情况下,缓冲区溢出会造成程序崩溃。在程序中,溢出的数据覆盖了返回地址。而如果覆盖返回地址的数据时另一个地址,那么程序就会跳转到该数据指定的地址,如果该地址存放的是一段精心设计的代码用于实现其他功能,这段代码就是shellcode。Set-UID是Unix系统中的一个重要的安全机制。当一个Set-UID程序运行的时候,它被假设为拥有者的权限。

原文地址:https://www.cnblogs.com/20199321zjy/p/12021584.html