2018-2019-1 20165320 《信息安全系统设计基础》 缓冲区溢出漏洞实验

  • 一、缓冲区溢出简介:

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


  • 二、实验具体步骤


    1、准备工作

    在实验楼64位的Linux环境下安装能用于编译32位C语言程序的包

    1296864-20181014130521073-1190673879.png



    2、关闭Linux系统的相关地址防护系统

    Ubuntu和其他一些Linux系统中,使用地址空间随机化来随机堆(heap)和栈(stack)的初始地址,让我们很难猜到地址。

      sudo sysctl -w kernel.randomize_va_space=0

    许多shell程序在被调用的时候会自动放弃特权,所以很难保持一个root权限。实验过程中这一步骤不能完全理解过程,所以就暂且放着。

    然后进入Linux32位的环境。

    1296864-20181014130539255-1807210365.png



    3、编译漏洞程序

    进入/tmp 目录新建一个stack文件,编译并设置SET-UID

    SET-UID 给了一个普通用户能临时使用超级用户权限的途径。

    GCC编译器有一种栈保护机制来阻止缓冲区溢出,所以我们在编译代码时需要用 –fno-stack-protector 关闭这种机制。 而 -z execstack 用于允许执行栈。

    1296864-20181014130551420-1151370380.png

    1296864-20181014130604859-795998902.png



    4、编译攻击程序

    在 /tmp 目录下新建一个 exploit.c 文件,为了节省时间,实验楼直接给了我们一个代码文件的链接。

      wget http://labfile.oss.aliyuncs.com/courses/231/exploit.c

    1296864-20181014130750539-603434661.png



    5、修改内存地址,进行覆盖

    exploit.c文件中,\x??\x??\x??\x?? 处需要添上 shellcode 保存在内存中的地址,这里发生溢出后刚好能够覆盖返回地址。strcpy(buffer+100,shellcode); 这一句又告诉我们,shellcode 保存在 buffer + 100 的位置。所以我们通过gdb调试获得shellcode的地址。修改了exploit.c文件,进行编译。
    1296864-20181014130810701-36443429.png

    1296864-20181014130818306-769828324.png

    1296864-20181014130830781-1875596913.png



    6、运行程序
    1296864-20181014130842024-161359735.png

    修改了地址保护机制后,运行不成功,显示段错误。

    1296864-20181014130908392-2018871482.png


  • 实验收获

    感觉按照实验步骤一步一步来,确实能够得到相应的结果,但是整个实验也就是一个走了一个过程,还是没有弄懂相关内存溢出的具体流程,以及相关攻击的思路,自己的水平还是不达标,还有一段很长的路要走,有关老师上课提到的栈帧的知识点还需要弄懂。

转载于:https://www.cnblogs.com/Gst-Paul/p/9786053.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值