csapp attack lab phase4

csapp attack lab phase4

每个gadget由一系列指令字节组成,最后一个字节为0xc3,编码为ret指令。

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
举个例子:
48 89 c7 是指令 movq %rax, %rdi, 对应的地址是0x400f15 + 0x3 也就是0x400f18, 是开始的指令位置。

例如:
ret编码为0xc3,nop编码为0x90。
在这里插入图片描述
在这里插入图片描述
0x4019a7 + 0x4 得到地址0x4019ab

在这里插入图片描述
48 89 c7 对应的汇编指令是 mov %rax, %rdi
在这里插入图片描述
0x4019c3 + 0x2 得到地址 0x4019c5

在这里插入图片描述
rsp 存储 0x59b997fa 是cookie 的值。
在这里插入图片描述
rip存储的值是retq时候,rsp存储mov %rax, %rdi 对应的地址.

在这里插入图片描述

汇编

ret指令

当执行汇编指令ret时,计算机会进行以下操作:

  1. 将栈顶的值弹出,并将其赋值给指令指针寄存器rip,这样程序控制流会返回到调用函数的地方。
  2. 将栈顶指针rsp增加一个合适的值,以便指向上一个函数的栈帧。这样可以清除当前函数的栈帧,为返回到上一个函数做准备。

总的来说,ret指令会对rsp和rip寄存器进行操作,以实现函数返回的功能。

在执行ret指令时,栈顶指针rsp的增加值是由调用约定(calling convention)和编译器生成的代码决定的。在一般情况下,当函数调用结束时,栈需要被恢复到调用函数之前的状态,这就需要栈指针rsp回到上一个函数的栈帧。

当使用ret指令从函数返回时,它会弹出栈顶的地址并将程序计数器设置为这个地址,以便继续执行代码。一旦ret指令执行完成,弹出的地址就不再处于栈顶位置,而是成为了程序计数器所指向的位置,因此在普通情况下无法直接通过栈来访问这个地址。

如果在函数中保存了返回地址的拷贝,或者在调用ret之前将返回地址拷贝到其他位置,那么在函数返回后仍然可以通过这些拷贝来访问返回地址。但是直接通过栈来访问ret弹出的地址是不可能的。

stack frame

在x86-64架构中,一般的调用约定是将栈帧中的参数和局部变量保存在栈上,然后通过rsp指针来访问这些参数和局部变量。当函数调用结束时,栈指针rsp需要回到上一个函数的栈帧,这个值是根据当前函数的栈帧大小来计算的。

编译器会在编译时根据函数的参数、局部变量和其他需要保存在栈上的信息来计算栈帧的大小,然后在ret指令中使用适当的偏移值来恢复栈指针rsp。这个偏移值会确保rsp指向上一个函数的栈帧,从而实现函数返回的功能。

在大多数操作系统和体系结构中,栈帧的大小都是有限制的。这个限制通常由硬件和操作系统的设计决定。

在x86-64架构中,栈帧的大小受到寄存器的位数限制。例如,在64位操作系统中,通常会有一个默认的栈大小限制,例如1MB或者8MB。这个限制可以在操作系统内核中进行配置和调整。

此外,栈的大小还受到操作系统的限制,操作系统会为每个进程分配一定大小的栈空间。如果栈帧的大小超出了这个限制,就会发生栈溢出错误。

在编写程序时,需要注意栈帧的大小限制,避免过多的局部变量或者递归调用导致栈溢出。如果需要更大的栈空间,可以通过操作系统提供的机制来调整栈大小限制。

指令

将汇编转为二进制

gcc -c phase4.s 
objdump -d phase4.o > phase4.d

phase4.s
在这里插入图片描述
phase4.d
在这里插入图片描述

以十六进制的方式打印寄存器

x/x $rsp 是 GDB 中的命令,用于查看内存中地址为 $rsp 的内容。这个命令的含义是以十六进制格式显示 $rsp 地址处的内容。$rsp 是 x86 架构中的寄存器,用于存储栈顶的地址。

link

https://zhuanlan.zhihu.com/p/60724948
https://zhuanlan.zhihu.com/p/107048472

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

YOLO目标检测——无人机检测数据集下载分享【含对应voc、coco和yolo三种格式标签】

实际项目应用:无人机识别数据集说明:无人机检测数据集,真实场景的高质量图片数据,数据场景丰富标签说明:使用lableimg标注软件标注,标注框质量高,含voc(xml)、coco(json)和yolo(txt)三种格式标签…

MySQL数据库下载及安装教程(最最新版)

MySQL数据库下载及安装教程(最最新版) 一、下载mysql数据库二、安装Mysql三、验证是否安装成功(一)、命令提示符cmd窗口验证(二)、MySQL控制台验证 一、下载mysql数据库 进入MySQL官方网站(htt…

CCF CSP认证 历年题目自练Day47

题目 试题编号: 201712-3 试题名称: Crontab 时间限制: 10.0s 内存限制: 256.0MB 样例输入 3 201711170032 201711222352 0 7 * * 1,3-5 get_up 30 23 * * Sat,Sun go_to_bed 15 12,18 * * * have_dinner 样例输出 201711170…

杭州信息安全

更轻量级的用户开销 (Lower online burden) 更灵活的通信模型 (Flexible metadata-private messaging) 一对一通信 >多对一、一对多通信 Group messaging Broadcast / anycast 元数据隐私保护技术在其他系统的推广

<Linux>(极简关键、省时省力)《Linux操作系统原理分析之进程管理2》(4)

《Linux操作系统原理分析之进程管理2》》(4) 3 进程管理3.5 P、V操作3.5.1 信号量3.5.2 信号量的应用3.5.3 进程同步机制 3.6 进程通信3.6.1 消息通信3.6.2 信箱通信 3.7 死锁3.7.1 死锁的定义3.7.2 死锁产生的必要条件3.7.3 死锁的预防3.7.4 死锁的避免…

flink入门

1.安装flink,启动flink 文档地址:Apache Flink 1.3-SNAPSHOT 中文文档: Apache Flink 中文文档 代码:GitHub - apache/flink: Apache Flink 2. 打开端口 端口号, 启动jar ### 切换到flink 目录bin下 [rootlocalhost ~]# cd /…

Vue3 toRef函数和toRefs函数

当我们在setup 中的以读取对象属性单独交出去时,我们会发现这样会丢失响应式: setup() {let person reactive({name: "张三",age: 18,job: {type: "前端",salary:10}})return {name: person.name,age: person.age,type: person.jo…

2023最新最全【CUDA Toolkit 12.3】下载安装零基础教程【附安装包】

官网地址:这里 CUDA是英伟达公司开发的一种并行计算平台和编程模型。它利用GPU的强大计算能力,加速各种数学和科学计算、数据分析、机器学习、计算机视觉等任务。CUDA包括CUDA编程语言、CUDA运行时库、NVIDIA显卡等组件。 CUDA的编写方式分为两种&…

Python aiohttp 完全指南:快速入门

aiohttp 就是 Python 中一款优秀的异步 Web 框架,它能够帮助我们构建高效的异步 Web 应用和异步 HTTP 客户端。在本文中,我们将深入探讨 aiohttp 是什么以及如何使用它,通过简单易懂的案例带领你理解异步编程,以及如何处理异步请求…

OpenGL 的学习之路-4(变换)

三大变换:平移、缩放、旋转(通过这三种变换,可以将图像移动到任意位置) 其实,这背后对应的数学在 闫令琪 图形学课程 中有过一些了解,所以,理解起来也不觉得很困难。看程序吧。 1.画三角形&am…

FISCO BCOS 3.0【02】配置和使用系统自带的控制台

官方技术文档:https://fisco-bcos-doc.readthedocs.io/zh-cn/latest/index.html 我们在官方技术文档的基础上,进行,对文档中一些不清楚的地方进行修正 控制台提供了向FISCO BCOS节点部署合约、发起合约调用、查询链状态等功能。 第一步. 安…

Spring对事务的实现

Spring对事务的支持 事务概述事务的四个处理过程事务的四个特性 引入事务场景Spring实现事务的两种方式声明式事务之注解实现方式 事务概述 在一个业务流程当中,通常需要多条DML(insert delete update)语句共同联合才能完成,这多…