关于 ARM64 汇编:调用流程与栈帧结构解析

一、ARM64 函数调用分析(汇编级)

寄存器规则(AArch64 ABI)

用途寄存器
参数传递x0 ~ x7
返回值x0(最多两个:x0、x1)
栈指针sp
链接寄存器x30(lr)
帧指针x29(fp)
临时/通用寄存器x9~x15等

函数调用指令流程

bl target_func     ; 跳转并将返回地址保存到 x30(link register)
ret                ; 返回上一级,等价于 br x30

举例

mov x0, #2
mov x1, #3
bl  add_func        ; 调用 add_func(2, 3)

二、栈帧结构详解

每个函数调用会建立自己的“栈帧”,用于:

  • 保存 caller 的寄存器(尤其是 x29, x30)

  • 为局部变量腾出空间

  • 管理多层调用时的上下文切换

标准函数前后结构

函数入口

stp x29, x30, [sp, #-16]!    ; 保存 fp 和 lr,栈顶向下扩展 16 字节
mov x29, sp                  ; 新帧指针 = 当前栈顶

函数返回

ldp x29, x30, [sp], #16      ; 恢复帧指针和返回地址
ret                          ; 返回上一层

示例完整函数

func:stp x29, x30, [sp, #-16]!    ; 建栈帧mov x29, sp// 函数体ldp x29, x30, [sp], #16      ; 恢复ret

三、栈帧结构图解(栈向下增长)

高地址 ↑
───────────────上一帧 fp      ← x29返回地址(lr) ← x30
───────────────局部变量区参数传递区(x8+)
───────────────当前 sp(栈底)
低地址 ↓

分析技巧:

  • IDA 里找 stp x29, x30, [sp,#-xxx]! 是函数入口特征

  • 栈帧大小往往是 16 的倍数(对齐)


四、系统调用实现(Linux syscall in ARM64)

在裸汇编中实现 syscall 需要:

  • 把 syscall 参数放入 x0~x5

  • 把 syscall 编号放入 x8

  • 执行 svc #0 发起系统调用

系统调用号对照

功能syscall 号
write64
read63
openat56
mmap222
exit93

示例:调用 write 输出字符串

汇编代码(写到 stdout)

.global _start.section .data
msg:    .ascii "Hello ARM64!\n"
len = . - msg.section .text
_start:mov x0, #1              // stdoutldr x1, =msg            // buf addressmov x2, #12             // lengthmov x8, #64             // syscall number: writesvc #0                  // trigger syscall// exit(0)mov x0, #0mov x8, #93             // syscall number: exitsvc #0

编译运行方式(Linux ARM64 模拟器或真机)

aarch64-linux-gnu-as hello.s -o hello.o
aarch64-linux-gnu-ld hello.o -o hello
qemu-aarch64 ./hello

五、逆向视角:系统调用识别

在 IDA 中看到以下指令,基本可以确认是系统调用:

mov x8, #64       ; syscall 编号
svc #0            ; 系统调用

结合调用前的 mov x0, #1, ldr x1, =addr, mov x2, #len 可以还原 syscall 是写 stdout。

汇总图(函数调用 → 栈帧 → syscall)

main:stp x29, x30, [sp, #-16]!      // 保存mov x29, spmov x0, #1                     // arg0: stdoutldr x1, =msg                   // arg1: buffer addrmov x2, #13                    // arg2: lengthmov x8, #64                    // syscall writesvc #0                         // 发起调用ldp x29, x30, [sp], #16        // 恢复ret

六、总结

内容关键点
调用规则x0~x7 传参,x30 返回地址
栈帧结构使用 x29 做帧指针,函数内局部变量/保存寄存器都存在栈
系统调用x0~x5 参数, x8 syscall 号, svc #0 触发
IDA/Ghidra逆向stp/ldp, bl, svc 判断函数入口、调用、syscall
实战环境用 qemu + aarch64 工具链模拟也能练习

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

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

相关文章

Kafka vs RabbitMQ vs Redis:消息中间件全面对比与选型指南

Kafka vs RabbitMQ vs Redis:消息中间件全面对比与选型指南 一、各中间件消息流转全过程Kafka 消息流转全过程(含机制详解)1. 核心组件2. 流程详解 RabbitMQ 消息流转全过程(含机制详解)1. 核心组件2. 流程详解 Redis …

【代码级指南】从Zero-shot到Chain-of-Thought:Prompt工程全栈技术解析​

本文较长,建议点赞收藏,以免遗失。 从理论到实践,掌握Zero-shot/Few-shot Prompt设计精髓。 一、Prompt Engineering 核心概念图解 Prompt Engineering 三大支柱 二、Prompt 设计基础框架 1. Prompt 核心四要素 prompt_template "&q…

sizeof()函数无法计算形参指针指向的字符串大小

给定的代码中&#xff0c;func() 函数打印的 name_len 是 指针的大小&#xff0c;而不是字符串的长度。具体原因如下&#xff1a; 代码分析 #include <stdio.h> #include <string.h>void func(char *name) {printf("name_len:%d", sizeof(name)); // 打…

Python打卡:Day37

知识点回顾&#xff1a; 过拟合的判断&#xff1a;测试集和训练集同步打印指标模型的保存和加载 仅保存权重保存权重和模型保存全部信息checkpoint&#xff0c;还包含训练状态 早停策略 浙大疏锦行

Android 9.0(API 28)后字重设置

在 Android 应用中设置字体字重&#xff08;Font Weight&#xff09;可以通过多种方式实现&#xff0c;下面详细介绍各种方法及其适用场景。 1. 使用 XML 属性设置字重 1.1 基本字重设置&#xff08;API 1&#xff09; <TextViewandroid:layout_width"wrap_content&…

WebRTC(十):RTP和SRTP

RTP&#xff08;Real-time Transport Protocol&#xff09; 作用 RTP 用于传输实时媒体流&#xff08;如音频、视频&#xff09;&#xff0c;它不提供可靠传输&#xff0c;而是关注低延迟、高实时性。 报文结构 整体结构 RTP 报文由以下部分组成&#xff1a; RTP Header …

微服务架构下面临的安全、合规审计挑战

微服务架构在带来敏捷性、可扩展性等优势的同时&#xff0c;也给安全和合规审计带来了巨大的挑战。这些挑战主要源于微服务的 分布式特性、动态性以及数量庞大 等特点。 以下是微服务架构下安全和合规审计面临的具体挑战 一、安全审计挑战 1. 攻击面扩大和复杂性增加 服务数…

显卡等驱动程序的介绍与安装

文章目录 1. 什么是驱动程序2. 电脑的驱动程序有哪些3. 电脑的驱动程序的安装4. 独立显卡驱动程序的安装5. 现代化驱动程序的安装6. 驱动程序既然这么重要&#xff0c;为什么我不都下一遍呢&#xff1f; 1. 什么是驱动程序 假设我们现在成功组装了一台台式机&#xff0c;那我们…

【Python】高光谱数据分析

特征提取 import pandas as pd import numpy as np import matplotlib.pyplot as plt from sklearn.cross_decomposition import PLSRegression from sklearn.preprocessing import StandardScaler from sklearn.linear_model import LinearRegression# 设置matplotlib支持中文…

nt!CcGetVirtualAddressIfMapped函数中的nt!CcGetVacbLargeOffset函数分析--重要

第一部分&#xff1a; 1: kd> kc # 00 nt!CcGetVirtualAddressIfMapped 01 nt!CcFlushCache 02 Ntfs!LfsFlushLfcb 03 Ntfs!LfsFlushToLsnPriv 04 Ntfs!LfsWriteLfsRestart 05 Ntfs!LfsWriteRestartArea 06 Ntfs!NtfsCheckpointVolume 07 Ntfs!NtfsCheckpointAllVolumes 0…

K8s入门指南:架构解析浓缩版与服务间调用实战演示

目录 前言一、k8s概念理解1、k8s整体架构&#xff08;1&#xff09; Master 主节点&#xff08;2&#xff09; Node 工作节点&#xff08;3&#xff09; Etcd 键值存储数据库 &#xff12;、Pod被视为最小的部署单元&#xff13;、k8s的五种控制器类型&#xff08;1&#xff09…

【ubuntu下小工具】Crontab定时任务进行数据备份和清理

背景 在生产环境的深度学习项目中&#xff0c;系统每日会持续生成大量数据。如果不进行有效管理&#xff0c;随着时间的推移&#xff0c;磁盘空间将被占满&#xff0c;最终导致服务器瘫痪。 为解决这一问题&#xff0c;需设置一个定时任务去执行脚本&#xff0c;用以完成&#…

3dgs涉及的基本概念:球谐系数(SH 系数)等

1.球谐系数&#xff08;SH 系数&#xff09; ──────────────────────────────────────── 1.1 什么是球谐函数 (Spherical Harmonics&#xff0c;缩写为 SH) 球谐函数是一组定义在单位球面上的一组正交函数&#xff0c;类似于在二维平…

sql格式化自动识别SQL语法结构

一、安装包 PoorMansTSqlFormatterLib 二、代码实现 using Microsoft.AspNetCore.Mvc; using PoorMansTSqlFormatterLib.Formatters; using PoorMansTSqlFormatterLib.Parsers; using PoorMansTSqlFormatterLib.Tokenizers;namespace SaaS.OfficialWebSite.Web.Controllers …

LVS-DR负载均衡群集深度实践:高性能架构设计与排障指南

目录 一、核心原理与理论 二、背景与架构设计 三、全流程部署步骤 1. NFS共享存储配置&#xff08;192.168.7.100&#xff09; 2. Real Server节点配置&#xff08;四台服务器&#xff09; 3. Director服务器配置 四、常见问题解决方案 五、生产环境总结 拓扑示意图&am…

Hall 定理学习笔记

定义 对于一张二分图 G ( V , E ) G(V,E) G(V,E)&#xff0c;设其左右部点集分别为 V L , V R V_L,V_R VL​,VR​&#xff0c;不妨认为 ( ∣ V L ∣ ≤ ∣ V R ∣ ) (|V_L|\leq |V_R|) (∣VL​∣≤∣VR​∣)&#xff0c;定义该二分图的一组 完备匹配 为左部 ∣ V L ∣ |V…

使用jmeter进行websocket连接测试

一、WebSocket Sampler 插件安装 下载地址&#xff1a;http://download.csdn.net/detail/easternunbeaten/9753723 下载后&#xff0c;解压直接拷贝到Jmeter的lib下的ext文件夹里面,重启Jmeter&#xff0c;Sanpler下多一个Websocket选项 二、WebSocket 取样器字段介绍 1、W…

网络安全漏洞扫描是什么?如何识别目标进行扫描?

&#xff0c;现在大家对于网络安全漏洞扫描那可是相当在意这网络安全&#xff0c;如今在咱这个大时代里可是相当重要的一个事咧&#xff01;因为&#xff0c;随着互联网蹭蹭地发展&#xff0c;网络攻击还有数据泄露这类威胁那真是越来越多越来越大&#xff01; 咱先来说说啥叫…

NoSQL之Redis配置优化

NoSQL之Redis配置优化 一、Redis1.关系数据库与非关系型数据库关系型数据库非关系型数据库非关系型数据库产生背景 2.Redis基础Redis简介Redis安装部署配置参数 3.Redis命令工具redis-cli命令行工具redis-benchmark 测试工具 4.Redis数据库常用命令key相关命令(1)keys&#xff…

《HTTP权威指南》 第14章 安全HTTP

安全HTTP需要提供的功能&#xff1a; 服务器认证客户端认证完整性加密效率普适性管理的可扩展性适应性在社会上的可行性 HTTPS HTTPS方案的URL以https://开头&#xff0c;区别于https://。 HTTPS在HTTP的基础上使用SSL或者TLS&#xff08;传输层安全&#xff09;进行加密。 …