• 20169217 《Linux内核原理与分析》 第十二周作业


    Return-to-libc 攻击实验

    实验准备:

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

    sudo apt-get update
    sudo apt-get install lib32z1 libc6-dev-i386
    sudo apt-get install lib32readline-gplv2-dev

    输入命令“linux32”进入 32 位 linux 环境。输入“/bin/bash”使用 bash:

    实验步骤

    初始设置

       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

      为了防止缓冲区溢出攻击,最近版本的 gcc 编译器默认将程序编译设置为栈不可执行,而你可以在编译的时候手动设置是否使栈不可执行:

    gcc -z execstack -o test test.c    #栈可执行
    gcc -z noexecstack -o test test.c  #栈不可执行

      本次实验的目的,就是展示这个“栈不可执行”的保护措施并不是完全有效,所以我们使用“-z noexecstack”,或者不手动指定而使用编译器的默认设置。

    漏洞程序

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

      编译该程序,并设置 SET-UID。命令如下:

      我们还需要用到一个读取环境变量的程序:

    攻击程序

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

    获取内存地址
    用刚才的 getenvaddr 程序获得 BIN_SH 地址:

    gdb 获得 system 和 exit 地址:

     修改 exploit.c 文件,填上刚才找到的内存地址:

    攻击

    先运行攻击程序 exploit,再运行漏洞程序 retlib,可见攻击成功,获得了 root 权限:

      至此实验结束。

  • 相关阅读:
    JS练习:定时器--背景颜色交替变换
    JS练习:切换图片
    BOM对象和DOM对象
    CSS练习:仿小米官网
    classification
    where does the error come from
    梯度下降
    torch 中各种图像格式转化
    regression
    torch 的包应用
  • 原文地址:https://www.cnblogs.com/dkyliuhongyi/p/6155597.html
Copyright © 2020-2023  润新知