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

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 通过

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Sui Builder House日本京都站开启报名

下一站Sui Builder House将于6月29-30日在日本京都举行&#xff0c;为世界各地的开发者提供身临其境地学习和交流的机会。 春日的樱花已经绽放&#xff0c;黄金周也已经过去&#xff0c;现在是时候来京都参加Sui Builder House一起庆祝夏天的来临了。来自日本和周边地区的开发…

我用ChatGPT写2023高考语文作文(一):全国甲卷

2023年 全国甲卷 适用地区&#xff1a;广西、贵州、四川、西藏 人们因技术发展得以更好地掌控时间&#xff0c;但也有人因此成了时间的仆人。 这句话引发了你怎样的联想与思考&#xff1f;请写一篇文章。 要求&#xff1a;选准角度&#xff0c;确定立意&#xff0c;明确文体&am…

【TaskMatrix.AI - Visual ChatGPT】连接超大模型和超多API来完成任务

Github项目地址&#xff1a;https://github.com/microsoft/TaskMatrix 目前大规模预训练模型&#xff08;比如ChatGPT&#xff09;已经能够完成多个任务&#xff0c;例如 提供强大的对话功能&#xff0c;in-context learning能力和代码生成能力生成高层次的解决问题框架 然而…

什么是 tokens,ChatGPT里面的Tokens如何计数?

什么是 tokens&#xff0c;ChatGPT里面的Tokens如何计数&#xff1f; 什么是 tokens&#xff1f; Tokens 可以被认为是词语的片段。在 API 处理提示之前&#xff0c;输入会被分解成 tokens。这些 tokens 并不会精确地在单词的开始或结束处切分 - tokens 可以包含尾随的空格甚…

TI DSP芯片C2000系列读取FLASH数据

本文记录如何读取TI芯片的flash数据 进入TI官网下载UNIFLASH工具 点击查看详情 点击下载选项&#xff0c;根据系统下载对应版本 下载完成之后&#xff0c;点击安装。安装完成之后双击图标点开。如果你的板子已经供电&#xff0c;且编程器已经连接好&#xff0c;UNIFLASH会自动…

chatgpt赋能python:用Python实现ping命令:掌握网络连接的艺术

用Python实现ping命令&#xff1a;掌握网络连接的艺术 当我们需要测试网络连接的时候&#xff0c;ping命令是最经典的选择之一。然而&#xff0c;在一些情况下&#xff0c;使用命令行并不是很方便。那么&#xff0c;有没有可能用Python编写一个类似ping的功能呢&#xff1f; …

Linux中/dev/null和/dev/zero的作用

1./dev/null和/dev/zero介绍 在Linux环境中&#xff0c;我们会经常用到/dev/null和/dev/zero&#xff0c;今天为大家讲讲/dev/null和/dev/zero的作用以及使用场景。 1.1./dev/null介绍 linux中/dev/null&#xff0c;它是一种特殊的虚拟设备&#xff0c;用于写入而不是读取&a…

探秘美颜SDK的动态贴纸的技术原理

美颜SDK作为美颜相机的重要组成部分&#xff0c;其动态贴纸技术也是很多用户喜爱的功能之一。本文将探秘美颜SDK的动态贴纸技术&#xff0c;从技术原理、应用场景和未来发展等方面进行分析。 一、技术原理 **1. 人脸识别技术。**在添加动态贴纸时&#xff0c;第一步要做的肯定…

navicat 怎么导入运行bak文件,详细教程

文章目录 一、新建数据库&#xff0c;点击高级设置访问权限二、点击SQL Server备份三、右击空白&#xff0c;点击从文件还原四、找到备份的bak文件五、 点击“高级”选项六、然后点击 生产SQL&#xff0c;最后点 还原 一、新建数据库&#xff0c;点击高级设置访问权限 二、点击…

coco-annotator的安装与使用

文章目录 coco-annotator的安装与使用1. coco-annotator是什么2. coco-annotator可以做什么3. coco-annotator的安装3.1 先决条件3.2 coco-annotator的下载与安装 4. coco-annotator的使用4.1 创建用户4.2 创建数据集4.3 标注图像4.4 下载标注信息 5. coco-annotator远程访问5.…

[NOI2009] 描边

题目描述 小 Z 是一位杰出的数学家。聪明的他特别喜欢研究一些数学小问题。 有一天&#xff0c;他在一张纸上选择了 n 个点&#xff0c;并用铅笔将它们两两连接起来&#xff0c;构成 (&#xfffd;−1)22n(n−1)​ 条线段。由于铅笔很细&#xff0c;可以认为这些线段的宽度为…

2023软件测试卷出天际!!!性能测试为啥一枝独秀?

近十年是中国互联网发展最快的10年&#xff0c;互联网用户从4亿增长至10亿。面对用户量的暴增&#xff0c;用户体验就成为互联网产品最大的考验。而 影响用户体验的最重要因素就是性能。 流量为王的时代&#xff0c;性能测试是所有产品上线前必须通过的重要环节。 企业招聘性…

上海亚商投顾:沪指小幅震荡微涨 AI应用端持续活跃

上海亚商投顾前言&#xff1a;无惧大盘涨跌&#xff0c;解密龙虎榜资金&#xff0c;跟踪一线游资和机构资金动向&#xff0c;识别短期热点和强势个股。 市场情绪 大小指数今日走势分化&#xff0c;沪指全天窄幅震荡&#xff0c;创业板指低开低走&#xff0c;盘中一度跌超1.6%&a…

基于“三维六类”干扰分析模型进行FDD900干扰规避优化指导

1.概述 随着网络发展&#xff0c;鉴于900M覆盖上的优势&#xff0c;为增强深度覆盖及竞对提升&#xff0c;当前FDD 900M已在加快部署&#xff0c;但随之也带来了干扰问题。当前&#xff0c;干扰排查成为FDD 900M部署过程中大量存在的难题。由于干扰排查难度大&#xff0c;且排…

《Contrastive Learning for Unpaired Image-to-Image Translation》

Contrastive Learning for Unpaired Image-to-Image Translation 1. 摘要2. 介绍3. 相关工作3.1 图像转换、循环一致性3.2 关系保持3.3 深度网络嵌入中的感知相似性3.4 对比表示学习 4. 方法 原文及代码链接 https://github.com/taesungp/contrastive-unpaired-translation 1.…

Nginx踩坑记录(二) nginx: [warn] invalid value “TLSv1.3“ in /etc/nginx/nginx.conf:20

问题详情 &#xff08;通过指定配置文件的方式&#xff09;启动nginx&#xff0c;提示告警&#xff0c;nginx启动失败。 rootvultr:~# nginx -c /etc/nginx/conf/nginx.conf nginx: [warn] invalid value "TLSv1.3" in /etc/nginx/conf/conf.d/v2ray.conf:20问题原…

发现问题更全面,减少测试成本:WEB自动化测试的价值分析!

目录 前言&#xff1a; 一、WEB自动化测试的价值 1. 提高测试效率 2. 提高软件的质量 3. 减少测试成本 二、WEB自动化测试的瓶颈 1. 可维护性差 2. 兼容性问题 3. 比手工测试慢 三、代码示例 四、总结 前言&#xff1a; 自动化测试是软件开发中必不可少的一环&…

【支付平台】java springboot 通过ip获取所在地城市信息

如果只是想知道如何通过ip获取所在地城市信息,可直接看第三步. 如果搭建自己的支付平台,异地支付限制是必不可少的一环.因为市面上一些非法份子,会使用我们平台生成的付款码进行欺诈行为.这也是我们必须杜绝的一种现象.因此限制异地支付就是其中一种手段. 在上一篇文章【三方支…

第九篇:强化学习Q-learning算法 通俗介绍

你好&#xff0c;我是郭震&#xff08;zhenguo) 今天介绍强化学习第九篇&#xff1a;Q-learning算法 前面我们介绍强化学习基本概念&#xff0c;马尔科夫决策过程&#xff0c;策略迭代和值迭代&#xff0c;这些组成强化学习的基础。 从今天开始逐步介绍常用强化学习算法&#x…

SparkCore的相关概念

1、Spark的RDD算子 RDD算子的概念和分类 1、1 Transformation算子 定义&#xff1a;RDD算子&#xff0c;返回值仍是一个RDD的&#xff0c;称之为转换算子 特性&#xff1a;这类算子是lazy懒加载的。如果没有Action算子&#xff0c;转换算子是不工作的。 1、2 Action算子 定义&…