【南方科技大学】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。
-
你需要找出返回地址存储在哪个内存地址。
-
然后你需要找出你的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 文件包含:
-
更新后的 createBadfile.c,用于生成 BOF 程序的输入。
-
badfile 的副本。当 BOF 从 VM 中的命令行运行时,必须生成 shell
-
使用 BOF 程序获取 shell 的屏幕截图(参见下面的简单屏幕截图)
-
包含以下问题答案的文本文件:
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。】
相关文章:

【南方科技大学】CS315 Computer Security 【Lab2 Buffer Overflow】
目录 引言软件要求启动虚拟机环境设置禁用地址空间布局随机化(ASLR)设置编译器标志以禁用安全功能 概述BOF.ctestShellCode.c解释 createBadfile.c 开始利用漏洞在堆栈上查找返回地址 实验2的作业 之前有写过一个 博客,大家可以先看看栈溢出…...

持续集成与持续交付CI/CD
CI/CD 是指持续集成(Continuous Integration)和持续部署(Continuous Deployment)或持续交付(Continuous Delivery) 持续集成(Continuous Integration) 持续集成是一种软件开发实践&…...
C++学习笔记之变量作用域
C学习笔记之变量作用域 https://www.runoob.com/cplusplus/cpp-variable-scope.html 在C程序中,通常有 3 个地方可以声明变量 在函数或者代码块当中,为局部变量在函数的参数定义中,为形式参数在所有函数的外部,为全局变量 作用域…...

解决跨境电商平台账号无法访问的常见问题
跨境电商的迅猛发展,越来越多的卖家选择在全球各大电商平台如亚马逊、eBay等进行商品销售。然而,在实际运营过程中,卖家经常会遇到账号无法访问、应用打不开等问题,导致业务受阻。本文将针对这些问题进行详细分析,并提…...
P2847 [USACO16DEC] Moocast G
P2847 [USACO16DEC] Moocast G [USACO16DEC] Moocast G 题面翻译 Farmer John 的 N N N 头牛 ( 1 ≤ N ≤ 1000 1 \leq N \leq 1000 1≤N≤1000) 为了在他们之间传播信息,想要组织一个"哞哞广播"系统。奶牛们决定去用步话机装备自己而不是在很远的距离…...

针对国内AIGC市场,国内目前出台了那些法律法规?
针对国内AIGC市场,特别是AI生成与合成内容方面,中国已经出台了一系列法律法规来规范其发展和应用。 图片源自“央视新闻” 以下是一些主要的法律法规: 一、国家层面的法律法规 《中华人民共和国网络安全法》 施行时间:2017年6月…...
Windows+Ubuntu双系统下时钟设置
Ubuntu默认把系统时间(硬件时钟)设置为UTC时间,并根据本地时区和夏令时设置自动调整本地时间,这是一种很合理很优雅的处理硬件时钟和本地时钟的模式。而Windows系统是默认情况下把系统时间设置为本地时间,历来独霸电脑…...

一些写leetcode的笔记
标准库中的string类没有实现像C#和Java中string类的split函数,所以想要分割字符串的时候需要我们自己手动实现。但是有了stringstream类就可以很容易的实现,stringstream默认遇到空格、tab、回车换行会停止字节流输出。 #include <sstream> #incl…...
shopify主题开发之template模板解析
在 Shopify 主题开发中,template 文件是核心部分,它们定义了店铺中不同页面的布局和结构。下面将详细介绍 Shopify 主题中的 template 模板。 一、template 文件结构 在 Shopify 主题中,templates 文件夹包含了所有用于生成店铺页面的模板文…...

Zookeeper学习
文章目录 学习第 1 章 Zookeeper 入门1.1 概述Zookeeper工作机制 1.2 特点1.3 数据结构1.4 应用场景统一命名服务统一配置管理统一集群管理服务器动态上下线软负载均衡 1.5 下载zookeeper 第 2 章 Zookeeper 本地安装2.1 本地模式安装安装前准备配置修改操作 Zookeeper本地安装…...

FAT32文件系统详细分析 (格式化SD nandSD卡)
FAT32 文件系统详细分析 (格式化 SD nand/SD 卡) 目录 FAT32 文件系统详细分析 (格式化 SD nand/SD 卡)1. 前言2.格式化 SD nand/SD 卡3.FAT32 文件系统分析3.1 保留区分析3.1.1 BPB(BIOS Parameter Block) 及 BS 区分析3.1.2 FSInfo 结构扇区分析3.1.3 引导扇区剩余扇区3.1.4 …...

通义灵码在Visual Studio上
通义灵码在Visual Studio上不好用,有时候会出现重影,不如原生的自动补全好用,原生的毕竟的根据语法来给出提示的。...

基于SpringBoot的招生宣传管理系统【附源码】
基于SpringBoot的招生宣传管理系统(源码L文说明文档) 目录 4 系统设计 4.1 系统概述 4.2系统功能结构设计 4.3数据库设计 4.3.1数据库E-R图设计 4.3.2 数据库表结构设计 5 系统实现 5.1管理员功能介绍 5.1.1管理员登录 …...

SOT23封装1A电流LDO具有使能功能的 1A、低 IQ、高精度、低压降稳压器系列TLV757P
前言 SOT23-5封装的外形和丝印 该LDO适合PCB空间较小的场合使用,多数SOT23封装的 LDO输出电流不超过0.5A。建议使用时输入串联二极管1N4001,PCB布局需要考虑散热,参考文末PCB布局。 1 特性 • 采用 SOT-23 (DYD) 封装,具有 60.3C/W RθJA •…...

python绘制3d建筑
import matplotlib.pyplot as plt import numpy as np from mpl_toolkits.mplot3d.art3d import Poly3DCollection# 随机生成建筑块数据 def generate_building_blocks(num_blocks, grid_size100, height_range(5, 50), base_size_range(10, 30)):buildings []for _ in range(…...

机器学习实战21-基于XGBoost算法实现糖尿病数据集的分类预测模型及应用
大家好,我是微学AI,今天给大家介绍一下机器学习实战21-基于XGBoost算法实现糖尿病数据集的分类预测模型及应用。首先阐述了 XGBoost 算法的数学原理及公式,为模型构建提供理论基础。接着利用 kaggle 平台的糖尿病数据集,通过详细的…...
ElasticSearch数据类型和分词器
一、数据类型 1、Text (文本数据类型) 2、Keyword(关键字数据类型) 3、Alias(别名类型) 4、Arrays (集合类型) 5、Boolean(布尔类型) 6、日期类型 7、Numeric (数…...

【云原生监控】Prometheus之PushGateway
Prometheus之PushGateway 文章目录 Prometheus之PushGateway介绍作用资源列表基础环境一、部署PushGateway1.1、下载软件包1.2、解压软件包1.3、编辑配置systemctl启动文件1.4、创建日志目录1.5、加载并启动1.6、监控端口1.7、访问PushGateway 二、 配置Prometheus抓取PushGate…...
sqlalchemy JSON 字段写入时中文序列化问题
JSON字段定义 from sqlalchemy import Column, JSONclass Table(Base):__tablename__ "table"__table_args__ ({"comment": "表名称"})...extra Column(JSON, comment"其他属性")...局部序列化 def create(extra):table Table()#…...

C++ 类域+类的对象大小
个人主页:Jason_from_China-CSDN博客 所属栏目:C系统性学习_Jason_from_China的博客-CSDN博客 所属栏目:C知识点的补充_Jason_from_China的博客-CSDN博客 概念概述 类定义了一个新的作用域,类的所有成员都在类的作用域中ÿ…...
线程与协程
1. 线程与协程 1.1. “函数调用级别”的切换、上下文切换 1. 函数调用级别的切换 “函数调用级别的切换”是指:像函数调用/返回一样轻量地完成任务切换。 举例说明: 当你在程序中写一个函数调用: funcA() 然后 funcA 执行完后返回&…...

Map相关知识
数据结构 二叉树 二叉树,顾名思义,每个节点最多有两个“叉”,也就是两个子节点,分别是左子 节点和右子节点。不过,二叉树并不要求每个节点都有两个子节点,有的节点只 有左子节点,有的节点只有…...

STM32HAL库USART源代码解析及应用
STM32HAL库USART源代码解析 前言STM32CubeIDE配置串口USART和UART的选择使用模式参数设置GPIO配置DMA配置中断配置硬件流控制使能生成代码解析和使用方法串口初始化__UART_HandleTypeDef结构体浅析HAL库代码实际使用方法使用轮询方式发送使用轮询方式接收使用中断方式发送使用中…...

Scrapy-Redis分布式爬虫架构的可扩展性与容错性增强:基于微服务与容器化的解决方案
在大数据时代,海量数据的采集与处理成为企业和研究机构获取信息的关键环节。Scrapy-Redis作为一种经典的分布式爬虫架构,在处理大规模数据抓取任务时展现出强大的能力。然而,随着业务规模的不断扩大和数据抓取需求的日益复杂,传统…...

数据结构第5章:树和二叉树完全指南(自整理详细图文笔记)
名人说:莫道桑榆晚,为霞尚满天。——刘禹锡(刘梦得,诗豪) 原创笔记:Code_流苏(CSDN)(一个喜欢古诗词和编程的Coder😊) 上一篇:《数据结构第4章 数组和广义表》…...

深入理解 C++ 左值右值、std::move 与函数重载中的参数传递
在 C 编程中,左值和右值的概念以及std::move的使用,常常让开发者感到困惑。特别是在函数重载场景下,如何合理利用这些特性来优化代码性能、确保语义正确,更是一个值得深入探讨的话题。 在开始之前,先提出几个问题&…...

Web APIS Day01
1.声明变量const优先 那为什么一开始前面就不能用const呢,接下来看几个例子: 下面这张为什么可以用const呢?因为复杂数据的引用地址没变,数组还是数组,只是添加了个元素,本质没变,所以可以用con…...

Qt 按钮类控件(Push Button 与 Radio Button)(1)
文章目录 Push Button前提概要API接口给按钮添加图标给按钮添加快捷键 Radio ButtonAPI接口性别选择 Push Button(鼠标点击不放连续移动快捷键) Radio Button Push Button 前提概要 1. 之前文章中所提到的各种跟QWidget有关的各种属性/函数/方法&#…...
【仿生机器人】刀剑神域——爱丽丝苏醒计划,需求文档
仿生机器人"爱丽丝"系统架构设计需求文档 一、硬件基础 已完成头部和颈部硬件搭建 25个舵机驱动表情系统 颈部旋转功能 眼部摄像头(视觉输入) 麦克风阵列(听觉输入) 颈部发声装置(语音输出)…...
ubuuntu24.04 编译安装 PostgreSQL15.6+postgis 3.4.2 + pgrouting 3.6.0 +lz4
文章目录 下载基础包下载源码包编译 PG编译 postgis编译安装 pgrouting下载源码包配置编译参数编译安装 初始化数据库建表并检查列是否使用了 lz4 压缩算法检查 postgis 与 pgrouting 是否可以成功创建 下载基础包 sudo apt update && sudo apt upgrade -y sudo apt i…...