从汇编层看64位程序运行——函数的调用和栈平衡

函数调用

不知道有没有人想过一个问题:A函数调用B函数,B函数是如何知道在调用结束后回到A函数中的?

比如下面的代码,main函数调用foo。当foo执行完毕,需要执行main函数的return 0语句。但是main和foo是割裂的,foo是怎么回到main函数中继续执行的呢?

void foo() {int a = 10;a = a + 5;
}int main() {foo();return 0;
}

我们对上述代码进行反汇编。
在main函数中,我们没有看到任何蛛丝马迹,只看到call指令。
在这里插入图片描述
上图显示,当前代码执行到+8处(但是此行并没有执行,它的上一行执行了)。我们需要注意它的地址以及其后的地址0x0000555555555364,即+18处。理论上说,foo函数执行完毕后,CPU会执行+18处的代码。我们将通过调试来查看具体的原因。
让程序运行到+13处,可以看到当前rsp和rbp值相同,都是0x7fffffffdf10。
在这里插入图片描述
进入foo函数内部,可以看到call指令导致rsp减少了4字节,即有一个4字节值被call指令push到栈中。
在这里插入图片描述
通过下面指令,我们看到被push进来的值是0x0000555555555364。
在这里插入图片描述
我们反汇编这个地址附近代码,可以发现call指令将当前函数返回到的代码地址给push到栈中。这样foo函数在执行完毕后,就可以在栈中取出该地址,从而跳转到此处继续执行,完成从foo函数到main函数的跳跃。
在这里插入图片描述

栈平衡

栈平衡是指函数调用子函数后,栈顶要回到没有准备调用子函数之前。
在函数调用前后,涉及压栈操作的有如下情况:

  • call指令会将本函数中下条要执行的指令地址push到栈中
  • 如果子函数超过6个参数,则从第7个参数开始的参数会通过栈来传递

以下面的代码为例,

void foo10(int a, int b, int c, int d, int e, int f, int g, int h, int i, int j) {a = a + 5;b = b + 5;c = c + 5;d = d + 5;e = e + 5;f = f + 5;g = g + 5;h = h + 5;i = i + 5;j = j + 5;int sum = a + b + c + d + e + f + g + h + i + j;sum = sum + 5;
}int main() {int a = 10;int b = 20;int c = 30;int d = 40;int e = 50;int f = 60;int g = 70;int h = 80;int i = 90;int j = 100;foo10(a, b, c, d, e, f, g, h, i, j);return 0;
}

其中main函数的反汇编结果如下
在这里插入图片描述
我们来通过动态调试,来查看上述代码如何做到栈平衡。
我们让代码执行到+105处,查看此时rsp寄存器和栈上数据
在这里插入图片描述
然后让其他参数入栈,可以看到栈增加了0x20。(即rsp的值减少了0x20,0x7fffffffdef0->0x7fffffffded0)
在这里插入图片描述
进入foo10函数后,call导致的Next RIP压栈会在其ret时弹出。于是foo10执行完毕回到main函数后,rsp的值还不处于栈平衡状态。
在这里插入图片描述
但是紧接着foo10函数的调用,main函数会通过下面的命令让栈获得平衡
在这里插入图片描述
在这里插入图片描述
总体来说,栈的失衡是函数调用导致的,且发生在调用者函数中;栈的再平衡则是在子函数退出,执行回到调用者函数时立即执行的。

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

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

相关文章

SVN 分支管理深入解析

SVN 分支管理深入解析 引言 在软件开发过程中,版本控制是一个核心环节,它帮助团队有效地管理代码变更,协作开发,并维护项目历史。SVN(Subversion)作为一种流行的版本控制系统,提供了分支(Branch)功能,允许开发者在独立的线路上进行工作,而不会影响到主代码库。本文…

探索编程的多维宇宙:LangChain支持的编程范式全解析

探索编程的多维宇宙:LangChain支持的编程范式全解析 引言 在软件开发的丰富生态系统中,不同的编程范式为解决特定问题提供了独特的方法和工具。LangChain,作为一个多语言编程工具链,其设计理念在于支持多种编程范式,…

JavaWeb---HTML

一 HTML入门 1.1 HTML&CSS&JavaScript的作用 HTML 主要用于网页主体结构的搭建 CSS 主要用于页面元素美化 JavaScript 主要用于页面元素的动态处理 1.2 什么是HTML HTML是Hyper Text Markup Language的缩写。意思是超文本标记语言。它的作用是搭建网页结构&#xff0c…

.NET在工控上位机开发中有哪些成功的案例?

简述 工业自动化的浪潮正推动着传统制造业向智能化转型。在这一进程中,.NET技术以其强大的功能和灵活性,成为工控上位机开发的有力工具。本文将带您探索那些成功运用.NET技术的工控项目,展现.NET在工控领域的卓越优势。 工控领域的.NET革新 工…

Vulnhub靶场DC-3-2练习

目录 0x00 准备0x01 主机信息收集0x02 站点信息收集0x03 漏洞查找与利用1. joomla漏洞查找2. SQL注入漏洞3. 破解hash4. 上传一句话木马5. 蚁剑连接shell6. 反弹shell7. 提权 0x04 总结 0x00 准备 下载链接:https://download.vulnhub.com/dc/DC-3-2.zip 介绍&#…

一文清晰了解CSS——简单实例

首先一个小技巧: 一定要学会的vsCode格式化整理代码的快捷键,再也不用手动调格式了-腾讯云开发者社区-腾讯云 (tencent.com) CSS选择器用于选择要应用样式的HTML元素。常见的选择器包括: 类选择器:以.开头,用于选择具…

React Element介绍

React Element是React中的核心概念之一,它代表了React应用中的UI元素。React Element并不是真实的DOM节点,而是一个轻量级的、不可变的、描述性的对象,它包含了创建UI所需的类型(type)、属性(props&#xf…

前端框架前置知识之Node.js:模块化、导入导出语法、包的概念、npm介绍

什么是模块化? 在Node.js中,每一个文件都被视为一个单独的模块 概念:项目是由很多个模块文件组成的 好处:提高代码复用性,按需加载,独立作用域 使用:需要标准语法导出和导入进行使用 导入导…

在pycharm 2023.2.1中运行由R语言编写的ipynb文件

在pycharm 2023.2.1中运行由R语言编写的ipynb文件 背景与目标: 项目中包含由R语言编写的ipynb文件,希望能在pycharm中运行该ipynb文件。 最终实现情况: 未能直接在pycharm中运行该ipynb文件,但是替代的实现方法有:…

对AAC解码的理解

《对 AAC 音频解码的理解》 音频编解码技术在现代数字音频处理和传输中起着至关重要的作用,而高级音频编码(Advanced Audio Coding,简称 AAC)作为一种高效的音频压缩编码标准,被广泛应用于各种音频场景,如…

自然语言处理(NLP)——法国工程师IMT联盟 期末考试题

1. 问题1 (法语)En langue arabe lcrasante majorit des mots sont forms par des combinaisons de racines et de schmes. Dans ce mcanisme... (英语)In Arabic language the vast majority(十之八九) of…

Unity3D开发之传送带实现

/// <summary> /// 传送带 直线传送带 /// </summary> public class ConveyerBelt : MonoBehaviour {public float Speed 1;protected float mspeed;protected Vector3 direction;protected Rigidbody rd;List<GameObject> Goods new List<GameObject&…

计算机网络 VPN技术

VPN (Virtual Private Network&#xff0c;虚拟专用网络&#xff09;是一种通过公用网络&#xff08;通常是因特网&#xff09;建立专用网络的技术 VPN&#xff08;Virtual Private Network&#xff0c;虚拟专用网络&#xff09;是一种通过公用网络&#xff08;如互联网&#x…

ServiceNow UI Jelly模板注入漏洞复现(CVE-2024-4879)

0x01 产品简介 ServiceNow 是一个业务转型平台。通过平台上的各个模块,ServiceNow 可用于从人力资源和员工管理到自动化工作流程或作为知识库等各种用途。 0x02 漏洞概述 由于ServiceNow的Jelly模板输入验证不严格,导致未经身份验证的远程攻击者可通过构造恶意请求利用,在…

在线图书销售管理系统设计

在线图书销售管理系统的设计是一个涉及多个模块和功能的复杂项目&#xff0c;它旨在提高图书销售的效率&#xff0c;优化库存管理&#xff0c;提升用户体验&#xff0c;以及提供数据分析支持。以下是系统设计的一些关键组成部分&#xff1a; 1. 需求分析 用户需求&#xff1a…

R语言简单介绍及零基础学习路径

R语言介绍 R语言是一种用于统计计算和数据分析的编程语言和软件环境。它最初由Ross Ihaka和Robert Gentleman在新西兰奥克兰大学创建&#xff0c;如今由R核心开发团队进行维护。 R语言广泛用于学术研究、经济学、金融、统计学、生物信息学和数据科学领域。以下是对R语言的一些详…

[综述笔记]Functional neuroimaging as a catalyst for integrated neuroscience

论文网址&#xff1a;Functional neuroimaging as a catalyst for integrated neuroscience | Nature 英文是纯手打的&#xff01;论文原文的summarizing and paraphrasing。可能会出现难以避免的拼写错误和语法错误&#xff0c;若有发现欢迎评论指正&#xff01;文章偏向于笔…

Stable Diffusion 使用

目录 背景 最简单用法 进阶用法 高手用法 safetensor 一、概述 二、主要特点 背景 Stable Diffusion 开源后&#xff0c;确实比较火&#xff0c;上次介绍了下 Stable Diffusion 最简单的concept。今天继续介绍下&#xff0c;以Liblib 为例&#xff0c;介绍下如何使用参…

策略模式适用场景与具体实例解析

策略模式在多种场合下都能发挥其优势&#xff0c;尤其在需要根据不同条件或策略选择不同算法的场景中。下面是几个具体的适用场景及其对应的实例&#xff0c;以帮助进一步理解策略模式的实际应用。 1. 支付方式选择 在电子商务网站中&#xff0c;用户可以选择多种支付方式&am…

807.力扣每日一题7/14 Java(执行用时分布击败100%)

博客主页&#xff1a;音符犹如代码系列专栏&#xff1a;算法练习关注博主&#xff0c;后期持续更新系列文章如果有错误感谢请大家批评指出&#xff0c;及时修改感谢大家点赞&#x1f44d;收藏⭐评论✍ 目录 解题思路 解题过程 时间复杂度 空间复杂度 Code 解题思路 首先…