【南方科技大学】CS315 Computer Security 【Lab2 Buffer Overflow】

目录

  • 引言
  • 软件要求
  • 启动虚拟机
  • 环境设置
  • 禁用地址空间布局随机化(ASLR)
    • 设置编译器标志以禁用安全功能
  • 概述
    • BOF.c
    • testShellCode.c
      • 解释
    • createBadfile.c
  • 开始利用漏洞
    • 在堆栈上查找返回地址
  • 实验2的作业

之前有写过一个 博客,大家可以先看看栈溢出基础。

引言

在本实验中,您将了解如何利用缓冲区溢出和其他内存漏洞来接管易受攻击的程序。目标是研究我提供的程序,然后弄清楚如何使用它来获得对系统的 shell 访问权限。 1996 年,Aleph One 写了一篇关于粉碎堆栈的规范论文。您应该阅读本文,因为它详细描述了堆栈粉碎的工作原理。如今,许多编译器和操作系统已经实现了安全功能,可以阻止本文中描述的攻击。然而,它仍然为新的攻击和(特别是)这个实验室作业提供了非常相关的背景。

Aleph One: Smashing the Stack for Fun and Profit

Another (long) description of Buffer Overflows is here

软件要求

所有必需的文件和源代码都打包在提供的 Lab 2 虚拟机中。

The VMWare Software

https://www.vmware.com/

The VirtualBox Software

https://www.virtualbox.org/wiki/Downloads

https://www.vmware.com/support/developer/ovf/

https://www.mylearning.be/2017/12/convert-a-vmware-fusion-virtualmachine-to-virtualbox-on-mac/

The Kali Linux, Penetration Testing Distribution

GDB: The GNU Project Debugger

GCC, the GNU Compiler Collection

C source file including BOF.c, createBadfile.c, and testShellCode.c

启动虚拟机

Kali Linux VM 具有所有必需的文件。为此实验选择名为 Lab2BufferOverflows 的 VM。
在这里插入图片描述
使用用户名 root 和密码 [课堂上待定] 登录 Kali Linux。

在 Kali Linux 中,您应该能够看到一个名为 Lab2-BufferOverflows 的文件夹。该文件包含实验 2 的所有源代码。

在这里插入图片描述

环境设置

当前的编译器和操作系统中有许多保护措施可以阻止堆栈攻击,就像我们想要做的那样。我们必须禁用一些安全选项才能允许漏洞利用(请注意,您获得的虚拟机映像已配置环境)。

禁用地址空间布局随机化(ASLR)

地址空间布局随机化 (ASLR) 是当今大多数操作系统中使用的安全功能。 ASLR随机排列进程的地址空间,包括栈、堆和库。它提供了一种使利用难以成功的机制。您可以使用 /proc/sys/kernel/randomize_va_space 接口在 Linux 中配置 ASLR。支持以下值:

0 – No randomization

1 – Conservative randomization

2 – Full randomization Disable ASLR, run:

$ echo 0 > /proc/sys/kernel/randomize_va_space Enable ASLR, run:

$ echo 2 > /proc/sys/kernel/randomize_va_space

请注意,您需要 root 权限才能配置该接口。使用vi修改界面可能会出现错误。下面的屏幕截图显示了 /proc/sys/kernel/randomize_va_space 的值。

但是,此配置在重新启动后将无法保留。您必须在 sysctl 中进行配置。添加文件 /etc/sysctl.d/01-disable-aslr.conf 包含:

kernel.randomize_va_space = 0

这将永久禁用 ASLR。

下面的屏幕截图显示了 ASLR 配置。您可以打开一个终端并尝试一下。

在这里插入图片描述

设置编译器标志以禁用安全功能

当您使用 gcc 编译易受攻击的程序(在下一节中解释)时,请使用以下编译器标志来禁用安全功能。

-z execstack

关闭NX保护使堆栈可执行

-fno-stack-proector

删除检测堆栈粉碎漏洞的 StackGuard

-g

启用调试符号

概述

该漏洞利用的目的是教您缓冲区溢出是如何工作的。您必须通过将恶意输入传递到易受攻击的程序来获得 shell。该漏洞将名为“badfile”的文件作为输入。您的工作是创建一个错误文件,导致易受攻击的程序生成 shell。请注意,即使您的 shellcode 移动了几个字节,您也有一个 nop sled 来使漏洞发挥作用。在 Lab2BufferOverflows 文件夹中,它包含您需要使用的 C 文件。下面的屏幕截图表明了这一点。
在这里插入图片描述

BOF.c

在 BOF.c 中,有一个无界 strcpy,这意味着任何非 null 终止的内容都将覆盖缓冲区边界,并(希望)将一些信息放入您将设计的堆栈中。您的漏洞必须适用于我的 BOF.c 版本(不需要更改它以使您的代码正常工作)。

在这里插入图片描述
要编译 BOF.c,您需要添加提到的编译标志。

$ gcc –g –z execstack –fno-stack-protector BOF.c –o BOF

在这里插入图片描述

testShellCode.c

该程序只是让您测试 shell 代码本身。您可以找到或创建许多不同的“shell 代码”,这是了解它们的作用以及它们是否适合您(在您的操作系统上)的好方法。

您使用的实际 shellcode 只是此 C 代码的汇编版本:

#include <stdio.h> 
int main( ) 
{ char *name[2]; name[0] = "/bin/sh"; name[1] = NULL; execve(name[0], name, NULL); 
}

在这里插入图片描述

解释

这段代码是一个简单的C程序,它定义了一个shellcode并直接执行它。这个shellcode的目的是启动一个shell。

const char code[] = \
"\x31\xc0"         /* Line 1:  xorl    %eax,%eax             */
"\x50"             /* Line 2:  pushl   %eax                 */
"\x68""//sh"       /* Line 3:  pushl   $0x68732f2f          */
"\x68""/bin"       /* Line 4:  pushl   $0x6e69622f          */
"\x89\xe3"         /* Line 5:  movl    %esp,%ebx            */
"\x50"             /* Line 6:  pushl   %eax                 */
"\x53"             /* Line 7:  pushl   %ebx                 */
"\x89\xe1"         /* Line 8:  movl    %esp,%ecx            */
"\x99"             /* Line 9:  cdql                       */
"\xb0\x0b"         /* Line 10: movb    $0x0b,%al           */
"\xcd\x80"         /* Line 11: int     $0x80               */
;

Line 1-2: 将EAX寄存器清零,并将EAX的值压入栈中,为系统调用创建一个参数(在x86架构中,系统调用的编号在AL寄存器中)。

Line 3-4: 将字符串//sh和/bin压入栈中,它们将构成/bin//sh的字符串,这是启动shell的命令。

Line 5: 将ESP(栈指针)的值复制到EBX寄存器,为系统调用准备它的第二个参数(指向命令字符串的指针)。

Line 6-7: 再次将EAX的值压入栈中,并将EBX的值压入栈中,为系统调用准备它的第三个和第四个参数(指向环境变量的指针和指向参数的指针)。

Line 8: 将ESP的值复制到ECX寄存器,为系统调用准备第一个参数(指向文件路径的指针)。

Line 9: 将EAX寄存器的值符号扩展到EDX:EAX,为系统调用准备。

Line 10-11: 将系统调用号(execve,即0x0B)加载到AL寄存器,并触发中断,执行系统调用。

int main(int argc, char ** argv) {int (*func)();func = (int (*)()) code;(int)(*func)();return 0;
}

main 函数中,定义了一个函数指针 func 并将其指向 code(即shellcode)。

通过调用 func 来执行shellcode。

程序返回0,表示正常退出。

createBadfile.c

该程序写出“badfile”,但目前它只是充满了 nops(无操作)。您需要修改它以将您的 shell 代码放入其中并导致代码跳转到 shellcode。 badfile 中已经包含的 shellcode(作为字符数组)确实可以工作。您不需要修改它,但欢迎您这样做。

在这里插入图片描述
要编译 testShellCode.c 和 createBadfile.c,您不需要添加前面提到的编译标志。你可以简单地用gcc编译它
在这里插入图片描述

开始利用漏洞

整个攻击流程:

使用 createBadfile.c 创建包含NOP sled和shellcode的 “badfile” 文件。

使用 BOF.c 程序读取 “badfile” 文件内容到 aString 缓冲区。

bufferOverflow 函数中的 strcpy 操作导致缓冲区溢出,覆盖了返回地址。

当 bufferOverflow 函数返回时,控制流跳转到NOP sled,然后滑落到shellcode。

Shellcode被执行,启动一个shell。

该实验确实面临两个挑战。要执行 shellcode,您需要覆盖 bufferOverflow() 函数中的返回地址。您必须使该函数的返回地址指向您的 shellcode。

  1. 你需要找出返回地址存储在哪个内存地址。

  2. 然后你需要找出你的shellcode在内存中的地址,并将shellcode的地址写入你在步骤1中找到的返回地址。

我将为您提供有关步骤 1 的一些提示。

在堆栈上查找返回地址

为了找到堆栈上的返回地址,我们首先使用 GDB(GNU 项目调试器)来查看汇编代码。您可以从这里 找到有关 GDB 的更多信息。请注意,您还可以使用工具 objdump 来读取汇编代码。

$ gdb BOF

在这里插入图片描述
首先,我们反汇编BOF程序的main()函数。我们在 main() 函数中找到了 bufferOverflow() 函数(在 GDB 中输入 disas main)。然后,我们反汇编了 bufferOverflow() 函数,该函数存在漏洞。

$ (gdb) disas main

$ (gdb) disas bufferOverflow

在这里插入图片描述
您需要了解汇编代码才能找到返回地址在堆栈上的位置。接下来,在 GDB 中输入 run 来执行 BOF 程序。

$ (gdb) run

在这里插入图片描述

正如我们所预料的,BOF 程序生成了一个异常,即分段错误。指令指针(EIP)是0x90909090。这是因为我们在 BOF 程序中的缓冲区溢出的 badfile 上放置了 NOP sled。

您还可以通过在GDB中执行info register来查看更多寄存器信息

$ (gdb) info register

在这里插入图片描述
请注意,您始终可以在 GDB 中键入帮助来学习命令。

实验2的作业

一个 zip 文件包含:

  1. 更新后的 createBadfile.c,用于生成 BOF 程序的输入。

  2. badfile 的副本。当 BOF 从 VM 中的命令行运行时,必须生成 shell

  3. 使用 BOF 程序获取 shell 的屏幕截图(参见下面的简单屏幕截图)

  4. 包含以下问题答案的文本文件:

a. 当你在没有“-z execstack”的情况下编译时会发生什么?
【如果不使用-z execstack选项,gcc编译器默认会启用NX(No eXecute)保护,这意味着栈是不可执行的。在这个程序中,shellcode存储在栈上,由于栈被标记为可写的,它不能被执行。因此,当程序尝试执行shellcode时,会因为尝试在非可执行段(栈)中执行代码而崩溃并引发段错误。】

b.如果启用 ASLR 会发生什么?返回地址有变化吗?
【ASLR(Address Space Layout Randomization)的意思是操作系统将帮助随机化程序的虚拟内存地址,例如栈、堆、动态库以及程序本身的地址。不同版本的操作系统会以不同的方式实现ASLR。如果程序没有被编译为位置无关可执行文件(PIE),程序本身的地址将不会被随机化。在实验中,如果没有使用-fno-pie禁用PIE,那么程序本身的地址将会被随机化,返回地址也会随之改变。】

c.当您使用 GDB、/home/root/Desktop/Lab2-BufferOverflows/BOF 和 ./BOF 运行 BOF 时,内存中 buffer[] 的地址是否会发生变化?
【是的,buffer[]在内存中的地址会改变。程序的入口并不是main函数,main函数是在__libc_start_main函数中被调用的,而__libc_start_main是在_start函数中被调用的。由于函数调用,argc、argv、envp等都会被压入栈中。argv[0]在不同的运行环境下可能会有所不同,而且GDB和不同shell之间的环境变量也可能不同。GDB启动时默认会使用绝对路径运行,因此压入栈中的内容也不一样,导致栈上数据的地址也不一样。解决这个问题的一种方法是在相同的环境变量下运行生成badfile的程序,这样就可以自动计算出栈上数据的偏移。此外,如果远程环境未知,也可以通过栈喷射等技术来解决。在本例中,由于使用strcpy进行溢出,ROP技术的使用受到限制(需要避免0字节),但仍然可以构造puts ROP来泄露libc基址,然后修改badfile直接攻击libc的Offset。】

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

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

相关文章

【裸机装机系列】2.kali(ubuntu)-裸机安装kali并进行磁盘分区-2024.9最新

【前言】 2024年为什么弃用ubuntu,请参考我写的另一篇博文&#xff1a;为什么不用ubuntu&#xff0c;而选择基于debian的kali操作系统-2024.9最新 【镜像下载】 1、镜像下载地址 https://www.kali.org/get-kali/选择installer-image&#xff0c;进入界面下载相应的ISO文件 我…

【Android 13源码分析】WindowContainer窗口层级-2-构建流程

在安卓源码的设计中&#xff0c;将将屏幕分为了37层&#xff0c;不同的窗口将在不同的层级中显示。 对这一块的概念以及相关源码做了详细分析&#xff0c;整理出以下几篇。 【Android 13源码分析】WindowContainer窗口层级-1-初识窗口层级树 【Android 13源码分析】WindowCon…

学习整理vue前端框架项目目录结构的含义

学习整理vue前端框架项目目录结构的含义 1、目录结构2、结构含义 1、目录结构 2、结构含义

EasyExcel拿表头(二级表头)爬坑,invokeHeadMap方法

OK&#xff0c;不废话&#xff0c;直接开干!说实话是有些坑&#xff0c;或者是我不会用吧 模板如下&#xff1a; invokeHeadMap 这个方法其实针对第一行就是表头的完全没问题。针对第二行的&#xff0c;我DEBUG拿到的是这样很明显&#xff0c;他拿到了第一行&#xff1b;既然…

python常用框架及使用方法

Python 有着广泛的应用领域&#xff0c;从 Web 开发到数据科学、自动化脚本、机器学习等&#xff0c;每个领域都有对应的强大框架。下面&#xff0c;我将为你介绍一些最常用的 Python 框架及其使用方法&#xff0c;让你快速了解它们的核心功能。 1. Web 开发框架 Django Dja…

高级java每日一道面试题-2024年9月12日-安全篇[加密篇]-有哪些加密算法, 加密算法都有哪些分类?

如果有遗漏,评论区告诉我进行补充 面试官: 有哪些加密算法, 加密算法都有哪些分类? 我回答: 加密算法是用来保护信息安全的技术(保护数据的机密性、完整性和真实性)&#xff0c;它将明文转换为密文&#xff0c;只有拥有正确密钥的接收者才能将其还原为原始的明文。加密算法…

PLC-Recorder 对西门子传动的采集方法

目录 一、增加西门子传动的通道 二、变量配置 2.1 语法格式 a&#xff1a;装置号 b&#xff1a;参数号 c&#xff1a;参数下标 2.2 配置及连接测试情况 三、正式采集 四、小结 PLC-Recorder V3.4.0版本增加了西门子传动参数采集的功能&#xff08;增加了传动的设备类型&a…

详细介绍 Servlet 基本概念——以餐厅服务员为喻

什么是Servlet Servlet 是 Java EE&#xff08;Java Platform, Enterprise Edition&#xff09;中用于构建动态 web 应用的组件。它在服务器端运行&#xff0c;并能够处理客户端请求&#xff0c;生成动态响应。以下是对 Servlet 的详细介绍&#xff1a; 1. Servlet 的基本概念…

(SERIES10)DM逻辑备份还原

1 概念 逻辑备份还原是对数据库逻辑组件&#xff08;如表、视图和存储过程等数据库对象&#xff09;的备份还原。逻辑导出&#xff08;dexp&#xff09;和逻辑导入&#xff08;dimp&#xff09;是 DM 数据库的两个命令行工具&#xff0c;分别用来实现对 DM 数据库的逻辑备份和逻…

Sqlserver常用sql

1. 数据库和表操作 创建数据库 CREATE DATABASE DatabaseName; 删除数据库 DROP DATABASE DatabaseName; 创建表 CREATE TABLE TableName ( Column1 DataType1, Column2 DataType2, ... ); 删除表 DROP TABLE TableName; 2. 数据操作 插入数据 INSERT INTO TableNam…

获取某宝拍立淘API接口:深度学习图像实现匹配和检索

1. 总体概述 拍立淘的核心技术在于图像识别与检索&#xff0c;融合了深度学习、计算机视觉、大数据处理等多个领域的先进技术1。通过构建大规模的商品图像数据库&#xff0c;并利用深度学习算法提取图像特征&#xff0c;实现高效的图像匹配与检索1。 2. 具体技术环节 &#…

【Linux 20】进程控制

文章目录 &#x1f308; 一、创建线程⭐ 1. 线程创建函数⭐ 3. 给线程传参⭐ 4. 创建多线程⭐ 5. 获取线程 ID &#x1f308; 二、终止线程⭐1. 使用 return 终止线程⭐ 2. 使用 pthread_exit 函数终止线程⭐ 3. 使用 pthread_cancel 函数终止线程 &#x1f308; 三、等待线程⭐…

k8s用StatefulSet部署redis

redis-config.yaml &#xff08;配置文件&#xff09; apiVersion: v1 kind: ConfigMap metadata:name: redis-config data:redis.conf: |# Redis general configuration​ bind 0.0.0.0 ​ protected-mode no ​ port 6379 ​ dir /data ​ appendonly yesse…

召回02 Swing 召回通道

为了避免小圈子重合却误判物品相似度很高&#xff1a;降低小圈子对相似度的影响。

更新20240915机器视觉海康Visionmaster学习步骤

一&#xff1a;海康VM软件&#xff1a; https://www.hikrobotics.com/cn/machinevision/service/download?module0 安装三个包(官网已经公布4.4,市面上还是主要以4.3为主) VisionMaster基础安装包V4.3.0 VisionMaster深度学习安装包 V4.3.0 VisionMaster示例程序 V4.3.0 …

matlab data = textscan(lin(5:end),‘%f%f%f%f%*[^\n]‘);语句解释

这行 MATLAB 代码使用 textscan 函数从文本中读取数据&#xff0c;并将其存储在 data 变量中。 data textscan(lin(5:end), %f%f%f%f%*[^\n]);解释 1. textscan 函数 textscan 是 MATLAB 中用于从文本中读取数据的函数。它将文本行按指定的格式读取&#xff0c;并将结果存储…

cc2530按键中断实现控制LED

1开启中断的步骤 1-1使能端口组的中断 IEN1 IEN2 实例 IEN2 | 0x10 //使能P1口中断 1-2 端口中断屏蔽 P0IEN和P1IEN P2IEN 实例 P1IEN |0x10&#xff1b; //使能P1_2口中断 1-3设置触发方式 PICTL 实例 PICTL |0X02 ;//P1_3到P1_2口下降沿触发 1-4设置中断优先级…

Android 13 固定systemUI的状态栏为黑底白字,不能被系统应用或者三方应用修改

目录 一.背景 二.思路 三.代码流程 1.colos.xml自定义颜色 2.设置状态栏的背景颜色 3.对View进行操作 ①.对Clock(状态栏左侧的数字时钟)进行操作 ②.对电池(BatteryMeterView)进行操作 4.锁屏状态栏 5.patch汇总 一.背景 客户需求将状态栏固定成黑底白字,并且不能让系…

数据结构应用实例(五)——关键路径

Content: 一、问题描述二、算法思想三、代码实现四、小结 一、问题描述 设计实现 AOE 网的关键活动与关键路径问题&#xff1b; 二、算法思想 获取拓扑序列&#xff1b;计算节点的最早开始时间 v e [ i ] ve[i] ve[i]&#xff1b;计算节点的最晚开始时间 v l [ j ] vl[j] v…

《SpringBoot+Vue》Chapter01_SpringBoot介绍

SpringBoot的介绍 简单来说&#xff0c;SpringBoot就是Spring提供的用于Web开发的脚手架框架。配置简单、上手快速 SpringBoot的特性 自带tomcat、Jetty服务器可以部署war包自动配置Spring框架和第三方框架能够提供应用的健康监控和配置的监控没有代码生成&#xff0c;并且尽可…