Attack Lab:Phase1~Phase5【缓冲区溢出实验】

news2024/10/5 21:23:13

注:本实验所用文件不是csapp官网给出的,是学校下发的。可以参考我的思路。

phase 1

本阶段目标是使getbuf调用结束后,控制权交给touch1函数。

则我们要知道两件事:一是缓冲区大小,二是touch1在虚拟内存中的位置。

用objdump -d ctarget > ctarget.s命令,反汇编ctarget代码。用本机安装的vs打开,方便阅读。

如下图,缓冲区大小为0x38字节,即56字节。

如下图,touch1的位置在0x4018a3.

那么,就可以先输入56字节的任意数据,将getbuf的缓冲区填满,然后溢出8个字节这8个字节原本的内容是test调用getbuf后的返回地址。将这个返回地址用touch1的地址(0x4018a3)覆盖,这样在getbuf函数执行retq指令后,程序就会返回到touch1函数,执行touch1函数

新建一个名为e1.txt文件,输入以下内容。

这个e1.txt文件中的内容就是在getbuf中,用户要输入的内容。但是不能直接定向输入到ctarget中,而是要将数据通过hex2raw程序转化后输入ctarget程序

hex2raw的使用方法如下图。

所以,如下图,用hex2raw小工具得到真正的二进制代码,带参数运行。本阶段完成。(个人信息部分已隐藏)

phase 2

本阶段目标是调用touch2,并且传递一个正确的参数。

其中cookie是0x2486651c

我们注入的代码的要做的事情:

将cookie的值(0x2486651c) mov到第一个参数(寄存器rdx)

把touch2位置压入栈中

返回

如下图,其中touch2的位置为4018d7。

翻译为汇编代码:

movl $0x2486651c, %rdi

push $0x4018d7

ret

将以上汇编代码用gcc编译为机器代码,再反汇编得到:

至此得到了应注入的机器代码。不要忘记,溢出区的地方写栈顶地址,以便在buf函数调用结束后rip跳到我们注入的代码的地址。栈顶地址可以通过gdb调试时的rsp值得到,为0x55631238。新建一个名为e2.txt文件,输入以下内容:

用hex2raw小工具得到真正的二进制代码,带参数运行。本阶段完成。

phase 3

本阶段的目标是调用touch3,调用时向touch3传递一个参数,是字符串,字符串的内容是cookie,即sval=“2486651c\0”.并且要特别注意字符串的存放位置,不能存在buf的栈帧(即大小为0x38字节的缓冲区)中,不然调用其他函数时马上会被覆盖,按地址读出的就不是我们写入的sval字符串了。所以将其存在溢出后的位置,即text函数的栈帧中。

我们注入的代码的要做的事情:

将存放字符串的地址mov到rdx

touch3函数首地址压栈

返回

如下图,touch3的地址为0x4019f0

翻译为汇编代码:

movq $0x55631278, %rdi

push $0x4019f0

ret

将以上汇编代码用gcc编译为机器代码,再反汇编得到:

至此得到了应注入的机器代码。不要忘记,溢出区的地方写栈顶地址(与阶段二的地址一样,是0x55631238,无需再次用gdb调试),以便在buf函数调用结束后rip跳到我们注入的代码的地址。接下来还要写入“2486651c\0”字符串。这个字符串转为ascii码为:32 34 38 36 36 35 31 63 00.

新建一个名为e2.txt文件,输入以下内容:

用hex2raw小工具得到真正的二进制代码,带参数运行。本阶段完成。

phase 4

接下来的两个阶段用到rtarget和farm.c

objdump -d rtarget > rtarget.s

用vs打开rtarget.s

本阶段的目标是用面向返回攻击的办法,使得touch2被成功调用。但是由于采用了栈随机化,即段程序分配的栈的位置在每次运行时都是随机的,这就使我们无法确定在哪里插入代码限制可执行代码区域,而且它限制栈上存放的代码是不可执行的且还有一个限制:最多用2段farm.c中的小工具。

所有可能会用到的机器指令如下图

不能注入自己写的代码,则缓冲区的0x38字节都不用,以56个00填充缓冲区。我们要用到的是溢出的部分。如同phase2的解决方法类似,把0x2486651c放到rdi寄存器中,返回。

所以溢出区的内容是

使用能从栈中pop的小工具

0x2486651c

touch2的地址

想把0x2486651c直接pop到%rdi中对应的机器指令为5f。

但小工具中没有5f,而有58。

于是想到movl %eax, %edi。恰好,小工具中有movl %eax, %edi对应的机器代码(89 c7)。

新建一个名为e4.txt文件,输入以下内容。

用hex2raw小工具得到真正的二进制代码,带参数运行。本阶段完成。

phase 5

本阶段的目标是用面向返回注入的办法调用touch3,并且最多用8段farm.c中的小工具。

用到的小工具如下面所示

根据在farm.c中找到的所有小工具,对应的指令顺序应该是下面这样的(顺序为从上到下)

movq %rsp, %rax

movl %eax, %edi

popq %ax

movl %ax, %cx

movl %cx, %dx

movl %dx, %si

R[ax] = R[si] + R[di]

movl %eax, %edi

对应的机器代码:

401ad9

89 c7

58

89 c1

89 ca

89 c6

48 8d 04 37

89 c7

各个小工具对应的地址为:

401ad9

401a9e

401a97

401b6f

401b32

401b97

401ad3

401a9e

栈中完整的内容如下(为了清晰的看出每句话的功能,写代码地址的地方替换为了汇编代码):

movq %rsp, %rax

movl %eax, %edi

popq %ax

0x48(偏移值)

movl %ax, %cx

movl %cx, %dx

movl %dx, %si

R[ax] = R[si] + R[di]

movl %eax, %edi

touch3的地址

cookie字符串

综上分析,新建一个名为e5.txt文件,输入以下内容。

用hex2raw小工具得到真正的二进制代码,带参数运行。本阶段完成。

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

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

相关文章

如何取消隐藏Excel中的行?这里提供详细步骤

取消隐藏Microsoft Excel电子表格中的所有行就像按下键盘快捷键或使用功能区上的按钮一样简单。我们将向你展示如何操作。 如何使用快捷方式取消隐藏Excel中的所有行 若要在电子表格中显示隐藏行,请使用Microsoft Excel启动电子表格。然后,访问包含隐藏…

P1083 [NOIP2012 提高组] 借教室

P1083 [NOIP2012 提高组] 借教室 题目描述 在大学期间,经常需要租借教室。大到院系举办活动,小到学习小组自习讨论,都需要向学校申请借教室。教室的大小功能不同,借教室人的身份不同,借教室的手续也不一样。 面对海…

【项目日记(七)】第三层: 页缓存的具体实现(上)

💓博主CSDN主页:杭电码农-NEO💓   ⏩专栏分类:项目日记-高并发内存池⏪   🚚代码仓库:NEO的学习日记🚚   🌹关注我🫵带你做项目   🔝🔝 开发环境: Visual Studio 2022 项目日…

Armv8-M的TrustZone技术之在安全状态和非安全状态之间切换

Armv8-M安全扩展允许在安全和非安全软件之间直接调用。 Armv8-M处理器提供了几条指令来处理状态转换: 下图显示了安全状态转换。 如果入口点的第一条指令是SG且位于非安全可调用内存位置中,则允许从非安全到安全软件的直接API函数调用。 当非安全程序调用安全API时,API通过…

Linux系统管理和Shell脚本笔试题

1、写一个sed命令,修改/tmp/input.txt文件的内容,要求:(1) 删除所有空行;(2) 在非空行前面加一个"AAA",在行尾加一个"BBB",即将内容为11111的一行改为:AAA11111BBB #写入内…

JavaWeb前端——HTML/CSS

HTML/CSS概述 HTML:学习标签,CSS:学习样式 HTML 1. 不区分大小写。 2. 属性可以使用单引号/双引号 3. 在记事本/编辑器中编写html语言,通过浏览器解析渲染语言 4. 语法结构松散(编写时要尽量严谨) VSc…

github请求超时解决方法

github请求超时解决办法 我使用windows执行如下git命令,提示超时 git clone xxxxx命令行提示如下: Failed to connect to github.com port 443: Timed out问题排查 可我Chrome可以正常访问github甚至ChatGPT,但是为什么在命令行里面却无法访问&#…

AI大模型开发架构设计(7)——人人都需要掌握的AI编程及应用案例实战

文章目录 人人都需要掌握的AI编程及应用案例实战1 AI代码生成模型与AI编程助手介绍程序设计方式的发展自动代码生成AI编程工具 2 AI编程助手的代码生成模型架构剖析以 CodeGeeX 为例-发展过程以 CodeGeeX 为例-训练过程以 CodeGeeX 为例-大规模代码数据处理以 CodeGeeX 为例-模…

『C++成长记』string使用指南

🔥博客主页:小王又困了 📚系列专栏:C 🌟人之为学,不日近则日退 ❤️感谢大家点赞👍收藏⭐评论✍️ 目录 一、string类介绍 二、string类的常用接口说明 📒2.1string类对象的常…

线下店铺的商品如何查价

品牌渠道主要分为线上和线下,线上的价格查价方式可以通过系统完成,系统筛选不同平台的数据,然后做价格的比较,输出是否破价的监测报表,这个过程多依赖系统去操作,但线下店铺的产品价格查价方式则没有固定的…

Windows下Cloudreve WebDAV挂载失败解决方法

如果你正在使用Windows的资源管理器挂载WebDAV,并且发现挂载失败,无论你如何去配置他 首先,Cloudreve 中可以为每个用户组单独设置“是否允许使用WebDAV访问”的开关,但是这玩意儿默认是开启的,所以如果不小心手残关掉…

机器学习系列——(六)数据降维

引言 在机器学习领域,数据降维是一种常用的技术,旨在减少数据集的维度,同时保留尽可能多的有用信息。数据降维可以帮助我们解决高维数据带来的问题,提高模型的效率和准确性。本文将详细介绍机器学习中的数据降维方法和技术&#…

解锁文档处理的全新维度:ONLYOFFICE 文档开发者版

前言 相信大家对于 ONLYOFFICE 这款办公软件可能已经有所耳闻,最近因工作需要,我在众多办公协作工具中选择了 ONLYOFFICE,原因主要是它开源经济实惠,可以部署在自己的服务器上并且能够轻松集成到我们的平台中。在数字化信息时代&…

10、数据结构与算法——堆

一、什么是堆 堆是一种特殊的树形数据结构,通常实现为完全二叉树或满二叉树。堆又分为两种类型最大堆(Max Heap) 和 最小堆(Min Heap) 1.1、什么是二叉树 二叉树是一种数据结构,它是由n(n≥0&a…

Python 计算两个时间之间的耗时

博主按照自己的需求写的一个可以计算程序耗时的函数,各位有需要的自行改写哈 实现的大致功能 功能1 记录开始时间,返回一个时间字典。数据包括:开始时间的日期格式、文本格式 功能2 记录结束时间和耗时,返回一个时间字典。数据包…

Web3智能合约:重新定义商业合作的未来

随着区块链技术的飞速发展,Web3时代正逐渐到来,而其中的智能合约成为推动商业合作变革的关键力量。本文将深入探讨Web3智能合约的概念、特点以及对商业合作未来的巨大影响。 什么是Web3智能合约? 智能合约是一种以代码形式编写、自动执行合同…

Oracle 面试题 | 05.精选Oracle高频面试题

🤍 前端开发工程师、技术日更博主、已过CET6 🍨 阿珊和她的猫_CSDN博客专家、23年度博客之星前端领域TOP1 🕠 牛客高级专题作者、打造专栏《前端面试必备》 、《2024面试高频手撕题》 🍚 蓝桥云课签约作者、上架课程《Vue.js 和 E…

Flask 入门4:Flask 模板

1. 前言 Flask 拥有丰富的扩展方法,且都有统一的特点:简单和即学即用。当我们要实现某个功能之前,可以提前去搜一搜这个功能包是否已经存在,这样也能帮助我剩下很多时间。那么要去哪里找到这些扩展包呢,这里推荐两个方…

Android:RecyclerView跨行跨列的LayoutManager:Spannedgridlayoutmanager

前言: RecyclerView可以使用GridLayoutManager实现跨行,但是不能跨列;瀑布流布局可以跨列但是又不能跨行。原生自带的各个LayoutManager中并没有可以又跨行又能跨列的。网上搜寻了一番,找到了一个亲测可行好用的三方库&#xff1…

微信小程序可以一个人开发么?

随着移动互联网的飞速发展,微信小程序已经成为了人们日常生活中不可或缺的一部分。它以其便捷性和高效性赢得了广大用户的青睐。对于许多有志于进入小程序领域的开发者来说,一个常见的问题是:微信小程序可以一个人开发吗?答案是肯…