当前位置: 首页 > news >正文

函数调用指令, 返回机制分析(x86_64)

预备


#include <stdio.h>int addDetail(int a, int b)
{return a + b;
}int add(int a, int b)
{int c;c = addDetail(a, b);return c;
}int main(int argc, char *argv[])
{int sum;sum = add(3, 5);printf("sum = %d\n", sum);return 0;
}

汇编

main

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

add

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

addDetail

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

基础

  1. rbp 是基底指针,指向堆栈的起点
  2. rsp是栈顶指针,指向堆栈的顶点。
  3. AT&T 语法中的指令格式为mnemonic source, destination
  4. .助记符是指令的人类可读名称。
  5. 源和目标是操作数,可以是立即数、寄存器、内存地址或标签。
  6. 立即数是常量,并以 a 为前缀$。例如,$0x5以十六进制表示数字 5。
  7. 寄存器名称以 . 为前缀

流程调用

main_rsp = 0x7fff ffff de40

main_rbp = 0x7fff ffff de60

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

进入函数add时的操作, 将添加新的栈帧

  1. 将main的栈底rbp压入栈中
  2. 再把rbp重新指向rsp寄存器, 进入新的栈帧
  3. 再rsp减去0x18个字节, 指向栈顶, 中间位栈空间
  4. 再把函数参数从寄存器中移动到栈空间
    参数a = *($rbp - 0x14)
    参数b = *($rbp - 0x18)

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

add_rsp = 0x7fff ffff de18

add_rbp = 0x7fff ffff de30

进入add函数内部, 再执行另一个函数addDetail前的操作

add参数a 和 b 在这里多复制了一遍, 可以引出右值引用

  1. 先把add帧栈中的值赋值到edx和eax寄存器中
  2. 再把exd和eax寄存器中的值赋值到esi和edi中

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

进入addDetail函数时的操作

// 为什么不申请空间?

  1. 将add的栈底rbp压入栈中
  2. 再把rbp重新指向rsp寄存器, 进入新的栈帧
  3. 再把函数参数从寄存器中移动到栈空间
    参数a = *($rbp - 0x4)
    参数b = *($rbp - 0x8)

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

addDetal_rsp = 0x7fff ffff de08

addDetal_rbp = 0x7fff ffff de08

addDetail函数内部

  1. 把自动变量移动到计算寄存器中, eax(操作运算符, 结果)和 edx
  2. 相加, eax得到结果

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

addDetail函数返回操作

没pop前

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

pop后, 从栈中弹出之前的detail_rbp ,把rbp 覆盖

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

retq,跳转回返回地址

返回add函数返回处

把返回的函数值赋值到自动变量中

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

add函数返回操作

防止自动变量消失, 要存到寄存器

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

leaveq 返回到 rbp被main_rbp覆盖, retq 跳转

main函数返回, 并退出

把寄存器中的值放到main的自动变量中

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

printf 输出

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

退出

最后调用了exit

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

http://www.lryc.cn/news/220184.html

相关文章:

  • mkl库配置
  • MPLAB X IDE 仿真打断点提示已中断的断点?
  • Appium 移动端自动化测试,触摸(TouchAction) 与多点触控(MultiAction)
  • 大厂面试题-innoDB如何解决幻读
  • 深度学习之基于Tensorflow人脸面部表情识别系统
  • centos7安装oxidized备份软件
  • 技术分享 | App测试时常用的adb命令你都掌握了哪些呢?
  • JMeter的使用——傻瓜式学习【下】
  • 嵌入式中利用VS Code 远程开发原理
  • 【多媒体文件格式】MP4、MPG、TS、3GP、3G2、3GPA
  • 学习Opencv(蝴蝶书/C++)相关——1. 前言 和 第1章.概述
  • 【数据分享】8个城市的共享单车数据(数据量约10亿条\免费获取)
  • 软件测试进阶篇----移动端测试
  • 偏序关系用分治优化建图:ARC165F
  • StripedFly恶意软件:悄无声息运行5年,感染百万设备
  • Flink SQL DataGen Connector 示例
  • 【监控指标】监控系统-prometheus、grafana。容器化部署。go语言 gin框架、gRPC框架的集成
  • 时序分解 | Matlab实现PSO-VMD粒子群算法优化变分模态分解时间序列信号分解
  • leetcode 684. 冗余连接
  • yolov8模型训练、目标跟踪
  • Flink SQL Regular Join 、Interval Join、Temporal Join、Lookup Join 详解
  • 如何在搜索引擎中应用AI大语言模型,提高企业生产力?
  • 实验七 组合器模式的应用
  • Springboot实现人脸识别与WebSocket长连接的实现
  • 智能安全帽功能-EIS智能防抖摄像头4G定位视频语音气体检测
  • TEMU跨境平台珠宝首饰RSL报告如何办理?
  • 51单片机的篮球计分器液晶LCD1602显示( proteus仿真+程序+原理图+PCB+设计报告+讲解视频)
  • 【NI-DAQmx入门】NI-DAQmx之Python
  • YoloV8目标检测与实例分割——目标检测onnx模型推理
  • pcigo图床插件的简单开发