3.pwn 函数调用流程,调用约定

news2025/2/24 16:46:35

前置准备

pop:
Pop指令的作用是弹栈,将栈顶的数据弹出到寄存器,然后栈顶指针向下移动一个单位。
具体来说:如pop rax,作用就是mov rax[rsp];add rsp 8;

push:
Push指令的作用就是压栈,将栈顶指针向上移动一个单位的距离,然后将一个寄存器的值存放在栈顶,
具体来说:如pushrax,其实际效果就是:sub rsp 8; mov [rsp] rax;

jmp:

立即跳转,不涉及函数调用,用于循环、ifelse这种场合
具体来说:如jmp 1234h,效果就是:mov rip 1234h;


call:
函数调用,需要保存返回地址。
具体来说:如call1234h,效果就是:push rip;mov rip 1234h; 

Ret:

用于函数返回
具体来说,就是pop rip。

函数调用流程

从一个实际例子出发
main调用func_b, func_b调用func_a。
我们从main函数开始,逐步分析栈帧变化。

当运行到call func b时main函数的栈帧。
Rbp指向栈顶,rsp指向栈底
这段栈帧存放了一些main的局部变量。
main函数要调用func b,main只需要call func b
也就是push rip; mov rip func b;

那么此时跳转到funcb继续执行,funcb直接执行主逻辑吗?
显然不是的,被调用函数还需要维护栈帧。
具体来说,需要以下几步:
push rbp;将调用函数的栈底指针保存,
mov rbp rsp;将栈底指针指向现在的栈顶。
sub rsp xxx;开辟被调用函数的栈帧,此时上一步的rbp就指向栈帧的底

func b执行完维护栈帧操作后的栈布局,
所谓栈帧的维护就是维护rbp和rsp两个指针。
Rsp永远指向栈顶。
Rbp用来定位局部变量。

 

 

现在,func_b要调用func_a,其调用流程与main函数调用func_b基本一致

不同处在于返回地址、rbp和rsp指向的地址,以及开辟的空间不同

在这里,我们学习一个新的汇编指令:leave。
leave指令:
作用是维护栈帧,通常出现在函数的结尾,与ret连用
其实际作用为:mov rsp rbp;pop rbp;
即:将栈顶指针指向栈帧的底部,然后在栈中弹出新的栈底指针。

在一个函数执行结束返回时,会执行leave;ret;
实际效果就是:movrsp rbp;pop rbp;pop eip;
此时我们观察程序执行至func a时的栈帧。
 

func a执行完毕返回后,栈布局如图
可以与之前的func b未调用func a前的栈帧对比
一模一样,说明已经恢复了栈帧。
唯一不同之处在于此时程序的rip已经指向了c=1
后面一条指令,说明func_a已经执行完毕。

以此类推,func b执行完毕返回后,栈布局如图
在这之后,main函数继续执行,直到结束。
至此,函数的调用返回执行流程结束。

 

总结:
调用函数:只需要将rip压栈,即pushrip,然后讲rip赋值为被调用函数的起始地址,这一操作被隐性的内置在call指令中。
被调用函数:push rbp;mov rbp rsp;sub rsp 0xxxx。即保存调用函数的rbp指针,将自己的rbp指针指向栈顶,然后开辟栈空间给自己用,此时rbp就变成了被调用函数的栈底。
函数返回:leave;ret;翻译过来就是:mov rsp rbp;pop rbp;pop rip;即恢复栈帧,返回调用函数的返回地址 

 参数传递方法——调用约定

返回值:一般来说,一个函数的返回值会存储到RAX寄存器
X86-64函数的调用约定为
从左至右参数-次传递给rdi,rsi,rdx,rcx,r8,r9
如果一个函数的参数多于6个,!则从右至左压入栈中传递

系统调用

syscall指令:
用于调用系统函数,调用时需要指明系统调用号
系统调用号存在rax寄存器中,然后布置好参数,执行syscall即可

示例:调用read(0,buf,size);

mov rax ;read's syscall number
mov rdi 0;first arg
mov rsi buf;second arg
mov rdx size;third ard
syscall;execute read(0 buf,size);


 

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

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

相关文章

38 IO流

目录 C语言的输入和输出流是什么CIO流stringstream的简单介绍 1. C语言的输入与输出 C语言中我们用到的最频繁的输出方式是scanf和printf,scanf:从标准输入设备(键盘)读取数据,并将值存在变量中。printf:…

【MySQL】锁(黑马课程)

【MySQL】锁 0. 锁的考察点1. 概述1. 锁的分类1.1 属性分类1.2 粒度分类 2. 全局锁2.1 全局锁操作2.2.1 备份问题 3. 表级锁3.1 表锁3.2 语法3.3 表共享读锁(读锁)3.4 表独占写锁(写锁)3.5 元数据锁(meta data lock, MDL)3.6 意向…

第5章 认证授权:需求分析,Security介绍(OAuth2,JWT),用户认证,微信扫码登录,用户授权

1 模块需求分析 1.1 什么是认证授权 截至目前,项目已经完成了课程发布功能,课程发布后用户通过在线学习页面点播视频进行学习。如何去记录学生的学习过程呢?要想掌握学生的学习情况就需要知道用户的身份信息,记录哪个用户在什么…

AIGC专栏12——EasyAnimateV3发布详解 支持图文生视频 最大支持960x960x144帧视频生成

AIGC专栏12——EasyAnimateV3发布详解 支持图&文生视频 最大支持960x960x144帧视频生成 学习前言项目特点生成效果相关地址汇总项目主页Huggingface体验地址Modelscope体验地址源码下载地址 EasyAnimate V3详解技术储备Diffusion Transformer (DiT)Hybrid Motion ModuleU-V…

智慧校园-教职工管理系统总体概述

在当今信息化时代,智慧校园教职工管理系统成为了提升教育机构管理效能的重要工具。该系统巧妙融合了先进的信息技术,为教职工的日常管理带来了一场静悄悄的革命。它不仅是一个信息存储库,记录着每位教职工从加入到离开的完整职业轨迹&#xf…

笔记12:if语句编程练习(打印输出三个数据中的最小值)

输入三个数,分别放入变量x,y,z中 打印输入数据中最小的那一个数 解决方案1 定义中间变量 t 1.比较x和y的大小关系,将较小的值赋值给t 2.比较t和z的大小关系,将较小的值赋值给t 3.t 中保存的就是3个数中的较小值 &am…

限时免费!国产Sora快手可灵Web网页端及全新功能上线!国货之光!

大家好,我是程序员X小鹿,前互联网大厂程序员,自由职业2年,也一名 AIGC 爱好者,持续分享更多前沿的「AI 工具」和「AI副业玩法」,欢迎一起交流~ 快手可灵(Kling)这回是真的出息了&…

Python爬取股票信息-并进行数据可视化分析,绘股票成交量柱状图

为了使用Python爬取股票信息并进行数据可视化分析,我们可以使用几个流行的库:requests 用于网络请求,pandas 用于数据处理,以及 matplotlib 或 seaborn 用于数据可视化。 步骤 1: 安装必要的库 首先,确保安装了以下P…

Hack The Box -- Blazorized

一、准备工作 端口扫描 详细扫描 Starting Nmap 7.94SVN ( https://nmap.org ) at 2024-06-30 21:39 EDT Nmap scan report for 10.10.11.22 Host is up (0.26s latency).PORT STATE SERVICE VERSION 53/tcp open domain Simple DNS Plus 80/tcp op…

海外发稿: 秘鲁-区块链新闻媒体通稿宣发

秘鲁媒体单发 随着全球化的不断深入,海外发稿已经成为众多企业宣传推广的重要方式之一。而在海外发稿的选择中,秘鲁媒体的地位尤为重要。秘鲁作为南美洲的重要国家之一,拥有众多知名媒体平台,包括diariodelcusco、serperuano、el…

非堆成加密是公私钥使用

对称加密学习-CSDN博客 加密算法学习-CSDN博客 非对称加密算法使用一对密钥,包括一个公钥和一个私钥,它们是数学上相关联的,但公钥可以公开分享,而私钥必须保密。以下是使用非对称加密算法的一般步骤: 密钥生成&…

【IT领域新生必看】深入浅出Java:揭秘`Comparator`与`Comparable`的神奇区别

文章目录 引言什么是Comparable接口?Comparable接口的定义实现Comparable接口示例: 什么是Comparator接口?Comparator接口的定义实现Comparator接口示例: Comparable与Comparator的区别排序逻辑位置示例: 可扩展性示例…

HashMap中的put()方法

一. HashMap底层结构 HashMap底层是由哈希表(数组),链表,红黑树构成,哈希表存储的类型是一个节点类型,哈希表默认长度为16,它不会每个位置都用,当哈希表中的元素个数大于等于负载因子(0.75)*哈希表长度就会扩容到原来的2倍 二. 底层的一些常量 三. HashMap的put()方法 当插入一…

简单的手动实现spring中的自动装配案例

简简单单的实现一个spring中的自动装配和容器管理的小骚操作。 1,创建AutoSetBean.java 使用injectBeans静态方法,可以扫描指定包下的所有带MyInject注解的字段,如果在beans的Map中存在这个字段的实例化类,则执行装配。 import…

c语言题目:成绩管理系统

🏆本文收录于「Bug调优」专栏,主要记录项目实战过程中的Bug之前因后果及提供真实有效的解决方案,希望能够助你一臂之力,帮你早日登顶实现财富自由🚀;同时,欢迎大家关注&&收藏&&…

Windows系统下载安装ngnix

一 nginx下载安装 nginx是HTTP服务器和反向代理服务器,功能非常丰富,在nginx官网首页,点击download 在download页面下,可以选择Stable version稳定版本,点击下载 将下载完成的zip解压即可,然乎在nginx所在…

【MySQL】事务四大特性以及实现原理

事务四大特性 原子性(Atomicity) 事务中的所有操作要么全部完成,要么全部不执行。如果事务中的任何一步失败,整个事务都会被回滚,以保持数据的完整性。 一致性(Consistency) 事务应确保数据库…

集智书童 | 英伟达和斯坦福基于 Transformer 的异常检测最新研究!

本文来源公众号“集智书童”,仅用于学术分享,侵权删,干货满满。 原文链接:英伟达和斯坦福基于 Transformer 的异常检测最新研究! 在作者推动各种视觉任务性能边界的同时,模型的大小也在相应增长。为了跟上…

SPIN-Diffusion:自我博弈微调提升文本到图像扩散模型性能

扩散模型作为生成AI的关键实体,已经在多个领域展现出了卓越的能力。然而,现有的扩散模型,如Stable Diffusion和SDXL,通常在预训练阶段后需要进行微调以更好地符合人类偏好。最近,研究者们开始尝试使用强化学习&#xf…

昇思MindSpore学习笔记4-03生成式--Diffusion扩散模型

摘要: 记录昇思MindSpore AI框架使用DDPM模型给图像数据正向逐步添加噪声,反向逐步去除噪声的工作原理和实际使用方法、步骤。 一、概念 1. 扩散模型Diffusion Models DDPM(denoising diffusion probabilistic model) (无)条件…