Return-to-libc 攻击实验

缓冲区溢出的常用攻击方法是用 shellcode 的地址来覆盖漏洞程序的返回地址,使得漏洞程序去执行存放在栈中 shellcode。为了阻止这种类型的攻击,一些操作系统使得系统管理员具有使栈不可执行的能力。这样的话,一旦程序执行存放在栈中的 shellcode 就会崩溃,从而阻止了攻击。

不幸的是上面的保护方式并不是完全有效的,现在存在一种缓冲区溢出的变体攻击,叫做 return-to-libc 攻击。这种攻击不需要一个栈可以执行,甚至不需要一个 shellcode。取而代之的是我们让漏洞程序调转到现存的代码(比如已经载入内存的 libc 库中的 system()函数等)来实现我们的攻击。

实验准备:

输入命令安装一些用于编译 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 目录下。代码如下:

这个程序有缓冲区溢出漏洞,我们的任务是利用这个漏洞。
上述程序有一个缓冲区溢出漏洞,它先从一个叫“badfile”的文件里把 40 字节的数据读取到 12 字节的 buffer,引起溢出。fread()函数不检查边界所以会发生溢出。应该注意到此程序是从一个叫做“badfile”的文件获得输入的,这个文件受用户控制。现在我们的目标是为“badfile”创建内容,这样当这段漏洞程序将此内容复制进它的缓冲区,便产生了一个 root shell 。
编译该程序,并设置 SET-UID。命令如下:

sudo sugcc -m32 -g -z noexecstack -fno-stack-protector -o retlib retlib.cchmod u+s retlibexit


-z noexecstack是栈不可执行。GCC 编译器有一种栈保护机制来阻止缓冲区溢出,所以我们在编译代码时需要用 –fno-stack-protector 关闭这种机制。“为了方便普通用户执行一些特权命令,SUID/SGID程序允许普通用户以root身份暂时执行该程序,并在执行结束后再恢复身份。”chmod u+s 就是给某个程序的所有者以suid权限,可以像root用户一样操作。

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

攻击程序

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

获取内存地址

gdb 获得 system 和 exit 地址:

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

删除刚才调试编译的 exploit 程序和 badfile 文件,重新编译修改后的 exploit.c:

rm exploit
rm badfile
gcc -m32 -o exploit exploit.c

攻击

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

至此实验结束。

转载于:https://www.cnblogs.com/crisgy/p/6160302.html

20169210《Linux内核原理与分析》第十二周作业相关推荐

  1. 20169210《Linux内核原理与分析》第十一周作业

    第17章 设备与模块 关于设备驱动和设备管理,讨论四种内核成分. 设备类型:在所有的linux系统中为了统一普遍设备的操作所分的类. 模块:Linux内核中用于按需加载和卸载目标码的机制. 内核对象: ...

  2. 2018-2019-1 20189204《Linux内核原理与分析》第三周作业

    OS是如何工作的 学习任务: 阅读学习教材「庖丁解牛Linux 」第2章 学习蓝墨云班课中第三周视频「操作系统是如何工作的?」,并完成实验楼上配套实验二. 云班课学习笔记: 计算机三大法宝 程序存储计 ...

  3. 《Linux内核原理与分析》第五周作业

    课本:第4章 系统调用的三层机制(上) -用户态.内核态和中断 -用户态:在低的执行级别下,代码能够掌控的范围有所限制,只能访问部分内存. -内核态:在高的执行级别下,代码可以执行特权指令,访问任意的 ...

  4. 20189220 余超《Linux内核原理与分析》第八周作业

    Linux内核如何装载和启动一个可执行程序 本章知识点 ELF(Executable and Linking Format)是一种对象文件的格式,用于定义不同类型的对象文件(Object files) ...

  5. 20189220 余超《Linux内核原理与分析》第七周作业

    分析Linux内核创建一个新进程的过程 基础知识概括 操作系统内核实现操作系统的三大管理功能,即进程管理功能,内存管理和文件系统.对应的三个抽象的概念是进程,虚拟内存和文件.其中,操作系统最核心的功能 ...

  6. 2022-2023-1 20222816《Linux内核原理与分析》第三周作业

    1.实验要求 完成一个简单的时间片轮转躲到程序内核代码 2.实验过程 进入实验楼,打开shell,输入一下代码: 实验结果: 3.mykernel时间片轮转代码分析 mypcb.h头文件,用来定义进程 ...

  7. 20222817《Linux内核原理与分析》第七周作业

    分析 Linux 内核创建一个新进程的过程 1.实验过程 下载新menu替换原来的menu并make: 使用gdb设置断点并调试,调试过程如下图所示: 2.实验分析及总结 do_fork关键代码分析 ...

  8. 2018-2019-1 20189206 《Linux内核原理与分析》第六周作业

    linux内核分析学习笔记 --第五章 系统调用的三层机制 学习重点--深入理解系统调用的过程 给MenuOS添加命令 添加命令的方式较为简单,在LinuxKernel/menu/test.c目录下, ...

  9. 20169207《Linux内核原理与分析》第五周作业

    这周的任务主要分为两个方面,第一方面,学习MOOC网上视频第三讲并完成配套的实验.第二方面,学习课本的第四章和第六章. 首先从实验开始讲起,前期我们对Linux内核的源码做了一个简单的了解.包括Mai ...

  10. 2018-2019-1 20189206 《Linux内核原理与分析》第五周作业

    linux内核分析学习笔记 --第四章 系统调用的三层机制 学习重点--系统调用 用户态.内核态和中断 Intel x86 CPU有四种不同的执行级别,分别是0,1,2,3其中数字越小,特权越高. L ...

最新文章

  1. 李宏毅机器学习笔记(三)——Regression: output a scalar amp;amp; Gradient Descent
  2. matplotlib.pyplot绘制函数图像希腊字母latex效果设置
  3. HTML--注册页面案例
  4. phpcmsV9站群去除域名绑定目录中的HTML的方法
  5. mysql事物及事物等级_MySQL事物原理及事务隔离级别
  6. PHP 设计模式 笔记与总结(3)SPL 标准库
  7. 直接用Jdbc就能操作数据库了,为什么还要用spring框架
  8. android新版本广告,新增朋友圈广告?微信6.1安卓新版发布
  9. python除法保留两位小数_除法巧算(Ⅱ),任何整数除7~9,11的快速心算技巧,爸妈收藏...
  10. dedecms织梦第三方登录插件-QQ登录、微博登录、微信登录
  11. linux vim 手册,Vim 参考手册
  12. C语言程序设计(第三版)何钦铭著 习题6-3
  13. 计算机信息管理专业 英文,计算机信息管理专业英文简历范文
  14. Canvas入门教学(4)动画与碰撞检测
  15. IT大侦“碳”:VxRail的可持续法宝
  16. 通过路由器访问光猫(openwrt)
  17. 前端工程师就业班Sass基础+进阶+案例开发经验【JS++前端】-艾小野-专题视频课程...
  18. 互联网的成功和端到端原则
  19. 80x86 汇编语言编程:判定数据序列的奇偶个数
  20. 关于手机话费充值的方法

热门文章

  1. MVC 页面传参到另一个页面
  2. eclipse编辑jsp文件和javascript代码很卡解决办法
  3. gdal - ogr简单对象模型
  4. 详介oracle的RBO/CBO优化器
  5. ACM001 Quicksum
  6. Oracle加密解密
  7. Git 学习笔记之 merge
  8. Windows平台下kafka环境的搭建
  9. 欧洲的数据中心与美国的数据中心如何区分?
  10. 十五步骤手把手学会制作网吧XP母盘制作