CSAPP - AttackLab实验(阶段1-5)

news2024/11/26 15:31:01

AttackLab实验

实验内容

官网:http://csapp.cs.cmu.edu/3e/labs.html

“AttackLab”是一个Linux下的可执行C程序,包含了5个阶段(phase1~phase5)的不同内容。程序运行过程中,要求学生能够根据缓冲区的工作方式和程序的反汇编代码来确定攻击字符串长度和字符串中的关键内容。每次成功实现缓冲区溢出攻击时都会有提示相应内容,如果攻击失败则单纯的提示segmentation fault相关信息。

要求攻击字符串的执行不许绕开代码中的validate函数,缓冲区溢出之后对应ret的返回地址可以是以下类型:

  1. 函数touch1、touch2、touch3的首地址;
  2. 自行注入的攻击的首地址;
  3. 在后两个阶段中(ROP攻击),与farm.c的对应的可利用的gadget的起始地址,farm.c对应的机器码已经包含在可执行文件中。可以使用的gadget首地址需处于start_farm和end_farm之间的部分。

注意:前三个阶段使用ctarget作为攻击目标文件,后两个阶段中使用rtarget作为攻击目标文件。

每个阶段考察一个缓冲区溢出方式,难度逐级递增:

  • 阶段1:使用非ROP方式对ctarget进行攻击,调用touch1,且成功输出Touch1!: You called touch1。若不完全满足题目要求,则会提示“Misfire”和FAIL相关字段。
  • 阶段2:使用非ROP方式对ctarget进行攻击,调用touch2,且成功输出Touch2!: You called touch2。攻击过程中需要改写cookie变量的值。若不完全满足题目要求,则会提示“Misfire” 和FAIL相关字段。
  • 阶段3:使用非ROP方式对ctarget进行攻击,调用touch3,且成功输出Touch3!: You called touch3。攻击过程中需要使hexmatch的返回值能够正确引导validate函数。若不完全满足题目要求,则会提示“Misfire” 和FAIL相关字段。
  • 阶段4:使用ROP方式对rtarget进行攻击,调用touch2,且成功输出Touch2!: You called touch2。若不完全满足题目要求,则会提示“Misfire” 和FAIL相关字段。
  • 阶段5:使用ROP方式对rtarget进行攻击,调用touch3,且成功输出Touch3!: You called touch3。若不完全满足题目要求,则会提示“Misfire” 和FAIL相关字段。

ctarget和rtarget都从standard input读入数据,可以以重定向文件的形式进行输入。实验利用getbuf函数中的缓冲区。getbuf函数的结构如下:

unsigned getbuf()
{
    char buf[BUFFER_SIZE];
    Gets(buf);
    return 1;
}

函数中的Gets函数与标准库中的gets函数类似,它从standard input中读取字符(以\n或者EOF结尾)并将它们添加字符串结尾符\0后存入缓冲区中。学生需要根据ctarget和rtarget文件及其反汇编代码来确定缓冲区位置及大小,并想办法构建出攻击字符串。

实验材料

  1. cookie.txt 个人cookie。
  2. ctarget 阶段 1-3 的攻击对象程序。
  3. farm.c 可利用代码片段源码。
  4. hex2raw 将字符串转二进制程序。
  5. rtarget 阶段 4-5 的攻击对象程序。
  6. README.txt 实验介绍文件。

附录

运行时栈

在这里插入图片描述

函数间的转移控制

在这里插入图片描述

机器码表

在这里插入图片描述

注意:D 为 2 字节功能性 nop 指令的编码,对前后文无影响。

实验过程

分析 ctarget 程序

我们需要利用程序中的 getbuf 函数,我们需要查看 ctarget 中的 getbuf 函数。执行 objdump -d ctarget > ctarget.s 查看 ctarget 的汇编代码:
在这里插入图片描述

从中可以看出 getbuf 的栈结构为(地址从大到小):ret 返回地址,0x38 内存空间(sub $0x38,%rsp)。并且 Gets 函数存放数据从 getbuf 的栈底开始(mov %rsp,%rdi)。

阶段1

我们需要利用 getbuf 函数来非正常跳转,所以我们需要利用溢出来修改 ret 返回地址。填充 0x38 个空字节来抵达存储 ret 返回地址的空间,然后填写目标地址来覆盖正常返回的地址。

  1. 查看 touch1 函数的地址
    在这里插入图片描述

  2. 创建输入文件 phase1.txt 并写入 0x38 个空字节和 touch1 函数的地址(小端法)。
    在这里插入图片描述

  3. 使用 hex2raw程序将 phase1.txt 转换成二进制文件 phase1-raw.txt

    执行 ./hex2raw < phase1.txt > phase1-raw.txt

  4. 运行 ctarget 查看结果

    执行./ctarget < phase1-raw.txt -q
    在这里插入图片描述
    PASS 通过。

阶段2

我们需要在阶段1的基础上,修改 cookie 变量的值。

  1. 查看 touch2 函数
    在这里插入图片描述

    从中我们看出 touch2 的地址为 0x4018d5,cookie 变量存储在 %edi 中。我们需要一段代码(即攻击代码)将 %edi 的值修改为我们的 cookie 值。

  2. 查看 cookie.txt 文件中的值

    cookie.txt 文件中的值为 0x77058131

  3. 构造攻击代码

    所以我们需要的攻击代码为

    mov $0x77058131,%edi
    ret
    
  4. 创建 inject.s 文件,将攻击代码写入,并编译。

    执行gcc -c inject.s,得到 inject.o 文件

  5. 反编译 inject.o 文件得到攻击代码的机器码

    执行objdump -d inject.o
    在这里插入图片描述

  6. 寻找攻击代码可存放位置

    通过前文的分析我们知道,我们输入的起始地址是在 getbuf 的栈底,所以我们可以将攻击代码放到 getbuf 的栈底。通过 gdb 定位到 getbuf 函数中的 Gets 行,查看 %rsp 即 getbuf 的栈底。
    在这里插入图片描述
    在这里插入图片描述

    所以第一个 ret 我们需要跳转到 getbuf 的栈底,即 0x55660908 处先执行我们的攻击代码,再通过攻击代码的 ret 跳转到 touch2 中。

  7. 查看 touch2 的地址
    在这里插入图片描述

  8. 创建 phase2.txt 并将攻击代码和两个跳转地址写入
    在这里插入图片描述

  9. 使用 hex2raw 程序将 phase2.txt 转换成二进制文件 phase2-raw.txt

    执行./hex2raw < phase2.txt > phase2-raw.txt

  10. 运行 ctarget 查看结果
    在这里插入图片描述

    PASS 通过

阶段3

本阶段需要通过 touch3 函数。

  1. 查看 touch3 函数
    在这里插入图片描述

    从中我们了解 touch3 函数的地址为 0x4019ec ,且我们需要修改 %rdi 的值使其满足 hexmatch 函数。

  2. 查看 hexmatch 函数
    在这里插入图片描述

    发现 hexmatch 比较了两个字符串,所以我们需要修改 %rdi 的值,使其为我们 cookie 字符串的首地址。

  3. 构造 cookie 字符串

    字符串在机器中是以 0 结尾字符序列,我们采用的是 16 进制,对照 ascii 码表 cookie:0x77058131 的字符序列应该为37 37 30 35 38 31 33 31 00

  4. 寻找 cookie 字符串存放地址

    我们可以放到返回地址 2 后
    在这里插入图片描述

    所以字符串的地址为栈底地址+ 72 字节(即,0x48),根据前文栈底地址为 0x55660908 ,所以字符串地址为 0x55660950 。

  5. 构造攻击代码

    mov $0x55660950,%rdi
    ret
    
  6. 将攻击代码写入 inject.s 并编译
    在这里插入图片描述

    执行gcc -c inject.s得到 inject.o 文件。

  7. 反编译 inject.o 文件,得到攻击代码的机器码

    执行 objdump -d inject.o
    在这里插入图片描述

  8. 攻击代码存放位置同阶段 2 ,在 phase3.txt 文件写入攻击代码,返回地址 1,2,和字符串。
    在这里插入图片描述

  9. 使用 hex2raw 程序将 phase3.txt 转为二进制文件 phase3-raw.txt

    执行./hex2raw < phase3.txt > phase3-raw.txt

  10. 运行 ctarget 查看结果
    在这里插入图片描述

    PASS 通过

分析 rtarget 程序

阶段 4,5 要求我们使用 ROP 的方式来进行攻击,即我们无法自己编写攻击代码来,但我们可以利用程序中带 ret 的片段代码来构造我们需要的攻击代码。

  1. 反编译 rtarget 程序

    执行objdump -d rtarget > rtarget.s

  2. 对照附录机器码表,查找可利用片段
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

    编号gadget地址机器码功能
    10x401a8f+0x3 | 0x401a9248 89 c7 c3mov %rax,%rdi
    20x401a8f+0x4 | 0x401a9389 c7 c3mov %eax,%edi
    30x401a9d+0x3 | 0x401aa058 c3pop %rax
    40x401acd48 8d 04 37 c3lea (%rdi,%rsi,1),%rax
    50x401af9+0x1 | 0x401afa89 d6 c3mov %edx,%esi
    60x401b1b+0x3 | 0x401b1e48 89 e0 c3mov %rsp,%rax
    70x401b1b+0x4 | 0x401b1f89 e0 c3mov %esp,%eax
    80x401b3e+0x2 | 0x401b4089 ca (20 d2) c3mov %ecx,%edx
    90x401b0d+0x2 | 0x401b0f89 c1 (08 c9) c3mov %eax,%ecx
    注意:括号内字节码可忽视
    

阶段4

阶段 4 的目标同阶段 2,但我们需要利用 gadget 来修改 %rdi。

  1. 查看可利用的 gadget

    我们可以利用 gadget3 来修改 %rax 的值,再利用 gadget1 将 %rax 赋给 %rdi。

    pop %rax
    mov %rax,%rdi
    ret
    
  2. 查看 touch2 地址
    在这里插入图片描述

  3. 编写 phase4.txt
    在这里插入图片描述

  4. 使用 hex2raw 将 phase4.txt 转二进制文件 phase4-raw.txt

    执行./hex2raw < phase4.txt > phase4-raw.txt

  5. 运行 rtarget 查看结果
    在这里插入图片描述

    PASS 通过

阶段5

阶段 5 同阶段 3 ,但没办法直接计算地址。不过我们可以通过 gadget4 来间接计算地址,通过 gadget 6,1 将 %rdi 改为 %rsp ,通过 gadget 3,9,8,5 修改 %rsi,然后通过 gadget 4 计算地址,再通过 gadget 1 将 %rdi 该为计算后的地址。

  1. 创建 phase5.txt 按顺序将 gadget 地址写入
    在这里插入图片描述

  2. 查看 touch3 地址
    在这里插入图片描述

  3. 将 touch3 地址和偏移量 0x48(即,72 字节)写入 phase5.txt
    在这里插入图片描述

  4. 使用 hex2raw 将 phase5.txt 转二进制文件 phase5-raw.txt

    执行./hex2raw < phase5.txt > phase5-raw.txt

  5. 运行 rtarget 查看结果
    在这里插入图片描述

    PASS 通过

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

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

相关文章

【Flutter】如何移除 Flutter 右上角的 DEBUG 标识

文章目录 一、前言二、什么是 DEBUG 标识三、为什么我们需要移除 DEBUG 标识四、如何移除 DEBUG 标识五、完整代码六、总结 一、前言 欢迎来到 Flutter 的世界&#xff01;在这篇文章中&#xff0c;我们将探索 Flutter 的一些基础知识。但是&#xff0c;你知道吗&#xff1f;这…

Science:“消除噪音”量子比特实现了纠错的重大突破

光子盒研究院 在《科学》杂志的一篇新论文中&#xff0c;芝加哥大学普利兹克分子工程学院Hannes Bernien助教实验室的研究人员描述了一种不断监测量子系统周围噪音并实时调整量子比特以减少误差的方法——他们引入了“旁观者量子比特(spectator qubit)”。 尽管他们有解决新型问…

数字图像处理实验报告

目录 实验二、图像在空间域上的处理方法 实验三、图像在频率域上的处理方法 实验二、图像在空间域上的处理方法 一、实验目的 了解图像亮&#xff08;灰&#xff09;度变换与空间滤波的意义和手段&#xff1b;熟悉图像亮&#xff08;灰&#xff09;度变换与空间滤波的MATLA…

买法拍房需要注意什么

法拍房&#xff0c;由于其价格亲民、房屋信息透明度高、竞拍过程公平公正而受到越来越多的人开始关注。但是其中又有着许多的风险及相关的注意事项。那么&#xff0c;如何做到成功“捡漏”&#xff0c;买法拍房需要注意什么呢? 买法拍房需要注意什么 1、隐藏的各种收费 税费&a…

优思学院|质量和可靠性是同一件事吗?

什么是质量&#xff1f; 质量是什么&#xff1f;早期的定义是“整体上用来决定产品或服务能否满足使用目的之固有性质与性能总合”&#xff0c;换言之&#xff0c;质量就是“可显示出品质与服务好坏的东西”。 不过&#xff0c;关于质量的想法随时代变化&#xff0c;有范围愈…

专访:诺奖得主Alain Aspect谈量子的挑战与未来

光子盒研究院出品 近期&#xff0c;诺贝尔物理学奖获得者Alain Aspect在接受电子工程专辑(EE Times Europe)采访时说&#xff1a;“诺贝尔奖是由于显示了纠缠的非凡特性而获得的&#xff0c;但我还研究了许多其他惊人的量子现象&#xff0c;包括将原子冷却到一光子反冲力以下。…

JavaWebHtmlCSS总结

目录 JavaWeb概述1.访问web的原理2.C/S软件和B/S软件区别3.静态网站和动态网站 HTMLHTML的概述Table表格详细用法见W3CSchool.chm合并单元格课程表 img标签table和img标签组合使用a标签表单表单Get提交和post提交 div和span CSS1.CSS概述2.CSS语法3.CSS三种写法行内样式内部样式…

专访泛境科技:如何借助3DCAT实时云渲染打造元宇宙解决方案

随着5G、VR/AR等技术的发展&#xff0c;元宇宙&#xff08;Metaverse&#xff09;这一概念越来越受到关注。元宇宙是一个由虚拟世界构成的网络空间&#xff0c;其中人们可以通过数字化的身份和形象进行各种社交、娱乐、创作和商业活动。元宇宙的核心是虚拟场景&#xff0c;它是…

教育信息化时代,如何打造中学理科信息化实验操作考场方案

近年来&#xff0c;我国考试招生制度不断改进完善&#xff0c;初步形成了相对完整的考试招生体系。但随着教育事业的逐步发展&#xff0c;国务院明确提出了改革考试形式和内容&#xff1a;完善中学学业水平考试&#xff0c;规范中考学生综合素质评价&#xff0c;加快推进中学院…

Promise.allSettled优化并行接口报错

问题背景 后端需要前端请求同一个接口三次&#xff0c;每次传参不同可以获取到不同的结果>构成计算资源的选项。 其中一个接口传参获取数据报错&#xff0c;导致整个计算资源都没有可选择的options&#xff1a; 前端代码使用Promise.all获取res1, res2, res3返回结果&…

云原生docker-cgroup资源限制

概述 Docker 通过 Cgroup 来控制容器使用的资源配额&#xff0c;包括 CPU、内存、磁盘三大方面&#xff0c; 基本覆盖了常见的资源配额和使用量控制。 Cgroup 是 ControlGroups 的缩写&#xff0c;是 Linux 内核提供的一种可以限制、记录、隔离进程组所使用的物理资源(如 CPU、…

【剑指offer】调整数组顺序使奇数位于偶数前面

文章目录 题目思路相对位置可以改变的思路相对位置不能改变的思路 题目 题目链接入口&#xff1a;调整数组顺序使奇数位于偶数前面 示例1&#xff1a; 输入&#xff1a;[1,2,3,4,5,6] 结果&#xff1a;[1,3,5,2,4,6] 示例2&#xff1a; 输入&#xff1a;[1,2,2,3,4,4,5,6,7…

2023年前端面试高频考点之 通信(渲染、http、缓存、异步、跨域)

目录 浏览器从输入url到渲染页面 过程⭐⭐⭐ Http和Https区别⭐⭐⭐ GET和POST发送请求⭐⭐⭐ 异同 http版本⭐⭐⭐ http状态码⭐⭐⭐ TCP⭐⭐⭐ 三次握手 四次挥手 流量控制&#xff08;滑动窗口机制&#xff09; 拥塞控制 keep-alive持久连接 TCP⭐⭐⭐ 三次握手…

Revit中绘制多坡度的迹线屋顶和构件对齐

一、Revit中创建特殊多坡度的迹线屋顶 在我们的日常生活中可以见到一些建筑屋顶为偏欧式风格的屋顶&#xff0c;而有时候在做迹线屋顶时也需要作出如图一所示的效果&#xff0c;说明特殊的多坡度屋顶也是应用非常广泛的&#xff0c;那我们应该如何实现绘制呢? 1.要得到如上图所…

Linux系统:安装及管理程序

安装及管理程序 一、linux源码包&#xff1a;1.源码包&#xff1a;2.二进制包&#xff1a;3.源码包的好处&#xff1a;4.源码包不足&#xff1a; 二、编译安装的过程&#xff1a;1.重点步骤&#xff1a; 三、挂载1.格式&#xff1a;2.挂载规则&#xff1a; 四、应用程序和系统命…

使用Jmeter进行性能测试的这套步骤,涨薪2次,升职一次

项目背景&#xff1a; 我们的平台为全国某行业监控平台&#xff0c;经过3轮功能测试、接口测试后&#xff0c;98%的问题已经关闭&#xff0c;决定对省平台向全国平台上传数据的接口进行性能测试。 01、测试步骤 1、编写性能测试方案 由于我是刚进入此项目组不久&#xff0c…

2023年专业连锁行业研究报告

第一章 行业概况 专业连锁行业是指以连锁经营模式运营的公司&#xff0c;其主要业务涵盖零售、餐饮、酒店、医疗、教育等领域。这些公司通过规模化、标准化的经营模式和供应链管理&#xff0c;提供专业化、高质量的产品和服务。专业连锁行业在全球范围内蓬勃发展&#xff0c;并…

LeetCode - 1 两数之和

目录 题目来源 题目描述 示例 提示 题目解析 算法源码 题目来源 1. 两数之和 - 力扣&#xff08;LeetCode&#xff09; 题目描述 给定一个整数数组 nums 和一个整数目标值 target&#xff0c;请你在该数组中找出和为目标值 target 的那 两个整数&#xff0c;并返回它们…

Jmeter接口测试实战篇:10分钟学会Jmeter的用法

一提到接口测试&#xff0c;通常大家会有这样的疑问&#xff1a;前端测试不是已经覆盖到各种业务逻辑了吗&#xff1f;为什么还要做接口测试&#xff0c;接口测试和前端测试是不是重复了&#xff1f;对于这个问题&#xff0c;可以从下面几个方面来解释&#xff1a; 什么是接口…

架构之冷热分离

本文依据《从程序员到架构师》阅读有感&#xff0c;记录书中案例并且结合作者工作经历进行分析。 当数据量过大&#xff0c;业务查询慢甚至导致数据库服务器CPU飙升&#xff0c;导致数据库宕机&#xff0c;影响用户体验。 场景&#xff1a; 1.客户两年多产生了近2000万的工单…