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 权限:

至此实验结束。

时间: 2024-10-14 01:10:10

20169217 《Linux内核原理与分析》 第十二周作业的相关文章

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

首先更新一下第一次实验关于堆栈的分析,这里我直接手写拍的图片. 这里再补充一点,第5步的call f 实际上等于 pushl %eip,movl f %eip,也就是将f的eip地址压栈,call g原理相同.leave等于movl %ebp,%esp,popl %ebp 也就是将ebp出栈,epb指向自己所存储值的栈,再将ebp的值付给esp,实现栈的释放.   接下来是实验: 2014年9月24日,Bash中发现了一个严重漏洞shellshock,该漏洞可用于许多系统,并且既可以远程也可以在

2017-2018-1 20179209《Linux内核原理与分析》第八周作业

Linux内核如何装载和启动一个可执行程 一.实验 1.1理解编译链接的过程和ELF可执行文件格式. 1.1.1编译链接过程 能用图说明的问题,就少用文字描述: 1.1.2ELF可执行文件 ELF可执行文件中有三种主要的目标文件: 一个可重定位文件保存着代码和适当的数据,用来和其他的object文件一起创建一个可执行文件或者是一个共享文件.主要是.o文件. 一个可执行文件保存着一个用来执行的程勋:该文件指出了exec如何创建程序进程映像. 一个共享object文件保存着代码和合适地数据,用来被下

2017-2018-1 20179203 《Linux内核原理与分析》第八周作业

攥写人:李鹏举 学号:20179203 ( 原创作品转载请注明出处) ( 学习课程:<Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029000 ) 一.实验要求: 1.理解编译链接的过程和ELF可执行文件格式,详细内容参考本周第一节: 2.编程使用exec*库函数加载一个可执行文件,动态链接分为可执行程序装载时动态链接和运行时动态链接,编程练习动态链接库的这两种使用方式,详细内容参考本周第二节: 3.使用gdb跟踪分析一个

2017-2018-1 20179202《Linux内核原理与分析》第八周作业

一 .可执行程序的装载 1. 预处理.编译.链接 gcc –e –o hello.cpp hello.c //预处理 gcc -x cpp-output -S -o hello.s hello.cpp //编译 gcc -x assembler -c hello.s -o hello.o-m32 //汇编 gcc -o hello hello.o //链接成可执行文件,使用共享库 用gcc -o hello.static hello.o -static静态编译出来的hello.static把C库

20169217 《Linux内核原理与分析》 第八周作业

此次作业仍然分为两个部分,第一部分为实验. 实验要求: 1. 阅读理解task_struct数据结构.   2. 分析fork函数对应的内核处理过程sys_clone,理解创建一个新进程如何创建和修改task_struct数据结构.   3.使用gdb跟踪分析一个fork系统调用内核处理函数sys_clone ,验证对Linux系统创建一个新进程的理解. 实验内容: 1.理解task_struct数据结构. 操作系统内核里面有操作系统所谓的三大功能,就是进程管理,内存管理和文件系统.但这里面最核

20169217 《Linux内核原理与分析》第七周作业

首先完善一下上周的作业,上周的嵌入式汇编并没有编译成功,究其原因,还是我对传参理解不到位,write函数的3个参数都要传递才行,并不是只传谣打印的字符串就行. 在老师的指导下并且参考了毛卫华同学的代码之后,终于编译成功啦! #include <stdio.h> #include <string.h> #include <stdlib.h> #include <unistd.h> int main() { char* msg = "liuhongyi

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

Nmap配合Metasploit进行端口扫描 1.Nmap扫描器基本使用 1.1简介 Nmap(Network Mapper)最早是Linux下的网络扫描嗅探器.其基本功能有三个: 探测一组主机是否在线: 扫描主机端口,嗅探其所提供的网络服务: 推断主机所用的操作系统 . 1.2基本命令 探测某个网段中活跃的主机的命令有: 进行ping扫描,打印出对扫描做出响应的主机,不做进一步测试(如端口扫描或者操作系统探测):nmap -sP 192.168.1.0/24 仅列出指定网络上的每台主机,不发送

2017-2018-1 20179202《Linux内核原理与分析》第十一周作业

Metasploit实现木马生成.捆绑.免杀 1.预备知识 (1)Metasploit Metasploit是一款开源的安全漏洞检测工具,全称叫做The Metasploit Framework,简称MSF.MSF是一个漏洞框架,它允许使用者开发自己的漏洞脚本,从而进行测试.下图为Metasploit的体系结构: ??????????图片来源玩转Metasploit系列(第一集) 基础库文件: Rex:Metasploit中的基础库,用于支持不同的协议.转换,以及套接字处理 MSF CORE:该

20169217 linux内核原理与分析 第四周作业

本次作业仍然分为两部分,第一部分为实验. 如实验楼的实验过程所述:使用实验楼的虚拟机打开shell,然后cd mykernel 您可以看到qemu窗口输出的内容的代码mymain.c和myinterrupt.c. 代码如下: cd LinuxKernel/linux-3.9.4  qemu -kernel arch/x86/boot/bzImage 实验截图如下: 通过观察我们会发现my_start_kernel和my_timer_handler快速的交替执行. 接下来查看mymain.c和my

20179223《Linux内核原理与分析》第十一周学习笔记

缓冲区溢出漏洞实验 一.实验简介 缓冲区溢出是指程序试图向缓冲区写入超出预分配固定长度数据的情况.这一漏洞可以被恶意用户利用来改变程序的流控制,甚至执行代码的任意片段.这一漏洞的出现是由于数据缓冲器和返回地址的暂时关闭,溢出会引起返回地址被重写. 二.实验准备 系统用户名shiyanlou 实验楼提供的是64位Ubuntu linux,而本次实验为了方便观察汇编语句,我们需要在32位环境下作操作,因此实验之前需要做一些准备. 1.输入命令安装一些用于编译32位C程序的东西: sudo apt-g