【南方科技大学】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;既然…

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 的基本概念…

【Linux 20】进程控制

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

召回02 Swing 召回通道

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

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汇总 一.背景 客户需求将状态栏固定成黑底白字,并且不能让系…

《SpringBoot+Vue》Chapter01_SpringBoot介绍

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

爬虫逆向学习(六):补环境过某数四代

声明&#xff1a;本篇文章内容是整理并分享在学习网上各位大佬的优秀知识后的实战与踩坑记录 引用博客&#xff1a; https://blog.csdn.net/shayuchaor/article/details/103629294 https://blog.csdn.net/qq_36291294/article/details/128600583 https://blog.csdn.net/weixin_…

C++_20_多态

多继承会造成 菱形继承** 使用虚继承来解决 不是给爷爷类加 也不是给子类加 是给父类加 虚基指针和虚基表 多态 概念&#xff1a; 概念&#xff1a; 一个事物的多种形态&#xff0c;简称多态 如&#xff1a; 对象的多态 ​ 张三 ​ 在对象面前 怂 ​ 在朋友面前 谄媚 ​ 在父…

python 读取excel数据存储到mysql

一、安装依赖 pip install mysql-connector-python 二、mysql添加表students CREATE TABLE students (ID int(11) NOT NULL AUTO_INCREMENT,Name varchar(50) DEFAULT NULL,Sex varchar(50) DEFAULT NULL,PRIMARY KEY (ID) ) ENGINEInnoDB AUTO_INCREMENT13 DEFAULT CHARSETu…

二十三种设计模式之原型模式

一.什么是原型模式 ‌‌原型模式是一种创建型对象设计模式&#xff0c;它通过复制一个已经创建的实例&#xff08;即原型对象&#xff09;来创建一个和原型对象相同的新对象。‌ 这种模式在面向对象软件设计中非常有用&#xff0c;因为它允许通过复制现有对象来快速生成多个相似…

springboot修改组件扫描包位置

步骤很详细&#xff0c;直接上教程 问题分析 默认情况下组件扫描包范围为启动类所在包及其子包 解决方法 我们只需要在启动类上面加个注解配置扫描范围 效果演示 温馨提示 非必要不建议修改&#xff0c;按规范创建项目结构一般不会出现这个问题

AI+代码审核平台CodeSec获CCIA中国网络安全创新创业大赛总决赛三等奖

近日&#xff0c;由中央网信办指导&#xff0c;中国网络安全产业联盟&#xff08;CCIA&#xff09;主办的2024年中国网络安全创新创业大赛总决赛及颁奖典礼在国家网络安全宣传周落下帷幕。开源网安“AI代码审核平台CodeSec V4.0” 凭借在AI方向的技术创新、技术突破及功能应用创…

热门远程控制工具大盘点,职场必备

如果你想要进行远程数据操作那向日葵远程控制软件你肯定听说过吧。如果你是想要远程运维&#xff0c;远程办公&#xff0c;数据传输&#xff0c;这些远程控制工具都可以实现。这次我将介绍几款我身边小伙伴都在使用的远程控制工具。 1.向日葵远程控制 链接直达&#xff1a;ht…

Python 数学建模——Prophet 时间序列预测

文章目录 前言原理使用方法&#xff08;初级&#xff09;代码实例Prophet 高级应用add_seasonality 添加自定义周期性add_regressor 添加外生变量交叉检验 前言 Prophet 是 Facebook 团队开发的一个时间序列分析工具&#xff0c;相比传统的 ARMA 时间序列分析&#xff0c;能够综…

常见 HTTP 状态码详解与Nginx 文件上传大小限制

在我们日常使用 Nginx 搭建网站或应用服务时&#xff0c;可能会遇到很多与文件上传和请求响应相关的问题。今天我们就来聊聊 如何限制文件上传的大小&#xff0c;并介绍一些常见的 HTTP 状态码 及其在 Nginx 中的处理方式。 一、文件上传大小限制 有时&#xff0c;我们需要限…