【BUPT计算机系统基础】CSAPP-lab3-缓冲区溢出攻击.docx

preview
需积分: 0 38 下载量 173 浏览量 更新于2023-03-23 3 收藏 1002KB DOCX 举报
【计算机系统基础】- 缓冲区溢出攻击详解 缓冲区溢出攻击是一种常见的安全漏洞利用技术,主要针对C语言及其类似编程语言编写的应用程序。这种攻击利用了程序处理数组或缓冲区时未进行边界检查的缺陷,使得攻击者能够向程序的内存空间写入超出预期的数据,从而改变程序执行流程,甚至执行任意代码。本文以北京邮电大学(BUPT)计算机系统基础课程中的实验为例,详细介绍如何理解和应对缓冲区溢出攻击。 ### 一、实验目的 实验的主要目的是让学生了解C语言程序在机器层面上的表示,掌握GDB调试器的使用,理解x86-64架构下的基本指令模式,以及通过实践了解缓冲区溢出攻击的危害。 ### 二、实验环境 实验在Linux环境下进行,使用`objdump`命令进行反汇编,`GDB`作为调试工具,以及积分榜系统监控实验进度。实验过程中,需要分析两个存在缓冲区溢出漏洞的程序——`ctarget`和`rtarget`。 ### 三、实验内容 实验分为两个部分,即代码注入攻击和返回导向编程(Return-Oriented Programming,ROP)攻击。在`ctarget`中,通过填充缓冲区并覆盖返回地址,实现调用`touch1`、`touch2`、`touch3`三个目标函数。而在`rtarget`中,利用ROP技术寻找内存中的小工具,组合成特定功能的指令序列,同样调用`touch2`和`touch3`。 ### 四、实验步骤与分析 #### 1. 准备工作 登录到服务器,解压文件,了解实验内容,确认实验分为5个阶段,并分别针对`ctarget`和`rtarget`进行攻击。 #### 2. 代码注入攻击 - **阶段一**:分析`test`函数调用的`getbuf`函数,发现缓冲区大小为24字节。通过覆盖返回地址,使用`touch1`函数的地址(0x00401945)来改变程序执行流。由于x86-64的little-endian存储方式,需使用`45 19 40 00`覆盖内存,通过`hex2raw`将数据转换后输入`ctarget`,成功调用`touch1`。 - **阶段二**:继续分析,发现需要修改 `%edi` 寄存器的值以匹配`cookie`。通过`cookie.txt`获取cookie值(0x64113650),编写汇编代码注入,将其转换为机器码,以达到调用`touch2`的目的。 #### 3. ROP攻击 对于`rtarget`,攻击者需要在内存中找到一系列短指令(gadgets),利用它们构建一个逻辑上完整的指令序列,以达到调用`touch2`或`touch3`的目标。这需要深入理解程序内存布局和x86-64的指令集。 ### 五、实验总结 缓冲区溢出攻击实验不仅锻炼了学生对C语言底层的理解,还提高了他们在实际环境中识别和利用安全漏洞的能力。通过这样的实践,学生能更好地理解软件安全的重要性,以及在编程时应如何预防这类攻击,如使用安全的编程语言、进行边界检查、使用栈保护等措施。