ARM64汇编07 - 访存指令

 

访存指令是ARM64汇编语言中的一部分,涵盖了数据访问和内存操作的指令。这些指令使处理器能够与内存进行交互,包括读取数据、写入数据以及执行其他内存相关的操作。理解这些指令对于理解处理器如何与内存交互以及如何管理数据至关重要。

访存指令介绍两个:

  • ldr

  • str

LDR

ldr 指令的意思是 Load Register,将寄存器里面的值当成地址,访问该内存地址储存的值,将这个值拿出来放到另一个寄存器。比如:

LDR             X8, [X21]

[X21] 类似数组写法,将内存看作数组,就是将 Mem[X21] 的值给 X8。

查看手册,LDR 有3种形式:

  • LDR (immediate)

  • LDR (literal)

  • LDR (register)

其实差别不大,在 IDA 中没啥区别,只需要了解它是在读取内存即可。

拿 LDR (immediate) 的格式来说:

imm9 是描述的偏移,范围是 -256 到 255,刚好占据9位,有一位是符号位。

第 10 与 11 bit位是表示的是内偏移还是外偏移。

STR

STR 与 LDR 对应,表示的意思是Store Register:

STR             X10, [SP]

将X10的值存到 SP 指向的内存地址上。

STR 有2种形式:

  • STR (immediate)

  • STR (register)

后续行为

访存指令还会有一些后续行为,就是类似于++i 与i++ 。

内偏移写法,比如:

E1 17 40 F9                   LDR             X1, [SP,#0x28]

这里计算地址要将 SP 的值加上 0x28,当成内存地址,然后获取地址上的值,赋值给  X1。

还有一种带感叹号的形式:

20 4C 40 F8                   LDR             X0, [X1,#4]!

感叹号的作用就是说,当指令执行完后,X1 的值也需要加上 4

还有一种外偏移的形式:

20 44 40 F8                   LDR             X0, [X1],#4

这种写法,也是当指令执行完后,X1 的值也需要加上 4。不过,在访存的时候,不会先加4,注意与带感叹号写法的区别。

内偏移与外偏移不会同时存在,就算想做也不行,因为指令位不够。

其他访存指令

与 LDR 相似的,还有 LDUR 等指令,也是访问内存,可以理解为 LDR 的特殊情况。

LDR指令:将数据从内存中取出来,存放到寄存器中。

LDUR指令:将内存中负数的数据取出来,并存放到寄存器中。

LDP指令:表示出栈指令

STR指令:将数据从寄存器中读出来,存储到内存中。

STUR指令:将寄存器中的负数数据读取出来,存放到内存中。

STP指令:表示入栈指令。

比如,在 IDA 中 patch ldr  指令的时候,就有可能会生成 ldur 指令。查看手册发现这两者的指令格式非常相似,只有一个 bit 位的区别。

理解全局变量

看一个例子:

#include <stdio.h>
#include <stdlib.h>
#include <stdint.h>uint64_t x;int main()
{x = 0x123456789a;getchar();return 0;
}

查看汇编代码:

.text:00000000000006F4                                     ; int __cdecl main(int argc, const char **argv, const char **envp)
.text:00000000000006F4                                     EXPORT main
.text:00000000000006F4                                     main                                    ; DATA XREF: LOAD:0000000000000438↑o
.text:00000000000006F4                                                                             ; .got:main_ptr↓o
.text:00000000000006F4
.text:00000000000006F4                                     var_s0=  0
.text:00000000000006F4
.text:00000000000006F4                                     ; __unwind {
.text:00000000000006F4 FD 7B BF A9                         STP             X29, X30, [SP,#-0x10+var_s0]!
.text:00000000000006F8 FD 03 00 91                         MOV             X29, SP
.text:00000000000006FC 08 00 00 B0                         ADRP            X8, #x_ptr@PAGE
.text:0000000000000700 08 F1 47 F9                         LDR             X8, [X8,#x_ptr@PAGEOFF]
.text:0000000000000704 49 13 8F D2 C9 8A A6 F2 49 02 C0 F2 MOV             X9, #0x123456789A
.text:0000000000000710 09 01 00 F9                         STR             X9, [X8]
.text:0000000000000714 C7 FF FF 97                         BL              .getchar
.text:0000000000000714
.text:0000000000000718 E0 03 1F 2A                         MOV             W0, WZR
.text:000000000000071C FD 7B C1 A8                         LDP             X29, X30, [SP+var_s0],#0x10
.text:0000000000000720 C0 03 5F D6                         RET
.text:0000000000000720                                     ; } // starts at 6F4
.text:0000000000000720
.text:0000000000000720                                     ; End of function main
.text:0000000000000720
.text:0000000000000720                                     ; .text ends
.text:0000000000000720

从 00000000000006FC  地址开始分析:ADRP X8, #x_ptr@PAGE

就是先将 PC 的地址做个页对齐,再加上某个偏移量。但是这里 IDA 已经帮我们计算好了,最终的值就是 #x_ptr@PAGE,所以该指令的意思就是将这个值赋值给 X8 寄存器。

x_ptr 是一个地址,从名字也可以看出,它是 x 变量的一个指针,指向的地址储存了 x 的值。

下一条指令LDR X8, [X8,#x_ptr@PAGEOFF]

X8 + x_ptr@PAGEOFF 的值处的地址储存的值赋值给 X8,从上一条指令我们知道,X8 的值是 x_ptr@PAGE,所以最终X8的值是 x_ptr@PAGE + x_ptr@PAGEOFF 处储存的值。

那么x_ptr@PAGE 与 x_ptr@PAGEOFF 这两个玩意到底是啥呢?

我们在这个符号的位置,按下 Q 快捷键,就能知道它真实的数字了:

.text:00000000000006FC 08 00 00 B0                         ADRP            X8, #0x1000
.text:0000000000000700 08 F1 47 F9                         LDR             X8, [X8,#0xFE0]

所以,最后的结果是将 0x1FE0 处储存的值放到了 X8 寄存器中。

我们去看 0x1FE0 处的内容:

.got:0000000000001FE0 08 20 00 00 00 00 00 00             x_ptr DCQ x

所以,就是将 0x0000000000002008 放入 X8 寄存器中。

看下一个指令MOV X9, #0x123456789A

0x123456789A的值放入 X9 寄存器。

看下一个指令STR X9, [X8]

将 X9 寄存器的值,放入内存中,就是将 0x123456789A 的值,放入 0x0000000000002008 这个地址。

但是需要注意,最终的地址肯定是需要 rebase 的,因为 adrp 指令计算了 pc 的值,静态分析时,我们的 pc 值相当于 0,动态调试的时,程序的一些地方需要重定位,肯定会改变一些值。

现在可以考虑一下:

.got:0000000000001FE0 08 20 00 00 00 00 00 00             x_ptr DCQ x

当程序运行时,这里储存的地址会不会变化?

我们调试看一下:

当这两条指令执行完之后,X8 寄存器的值为 0x00000056CBF43008

与静态分析时的地址相比较 0x0000000000002008 ,是页对齐的。

此时0x00000056CBF43008 储存的内容为:

赋值完成后,查看

后面,看到类似这种指令:

globalvar:00000056CBF41750 ADRP            X8, #off_56CBF42FE0@PAGE
globalvar:00000056CBF41754 LDR             X8, [X8,#off_56CBF42FE0@PAGEOFF]

要能想到这是访问全局变量。

got 储存了全局变量的地址,程序加载时对这个地址进行重定位,运行时给这个地址填入全局变量的值。

二手的程序员

红日初升,其道大光。河出伏流,一泻汪洋。潜龙腾渊,鳞爪飞扬。乳虎啸谷,百兽震惶。鹰隼试翼,风尘翕张。奇花初胎,矞矞皇皇。干将发硎,有作其芒。天戴其苍,地履其黄。纵有千古,横有八荒。前途似海,来日方长。

公众号

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

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

相关文章

ChatGPT又要更新了?GPT-5发布时间确定!

在K-Startup-OpenAI Match Day活动上&#xff0c;OpenAI CEO萨姆奥特曼(Sam Altman)首次公开肯定了GPT-5的潜力。他指出&#xff0c;GPT-5不仅会带来显著的进步&#xff0c;更将在高级推理功能上实现一次前所未有的飞跃&#xff0c;打破外界对于其仅是渐进式提升的误解。 同时现…

开源表单设计器颗粒度级别控制表单的显示条件原理分析

表单渲染中, 有些表单的显示有不同条件, 比如需要上一个表单的开关打开,或者文本内容为 xxxx, 或者需要大于或等于或小于指定值, 或者需要选中某个选项, 或者需满足以上多个条件或在满足多个条件中的一个, 有 n 种场景选择, 这样就需要条件显示配置功能, 来满足多样化需求 预览…

【干货】Java开发者快速上手.NET指南

前言 前几天有小伙伴在技术群里发了一个微软官方出的&#xff1a;适用于Java开发人员的.NET快速入门免费电子书&#xff0c;今天大姚来分享一下Java开发者想要快速上手.NET有哪些教程和优质资料。 微软适用于Java开发人员的.NET快速入门指南 下载阅读地址&#xff1a;适用于 …

(基础)AJAX概念和axios使用、URL、请求方法和数据提交、HTTP协议、接口、form-serialize插件

AJAX概念和axios使用 AJAX概念 AJAX就是使用XMLHttpRequest对象与服务器通信&#xff0c;它可以使用JSON、XML、HTML和text文本等格式发送和接收数据&#xff0c;AJAX最吸引人的就是它的异步特性&#xff0c;也就是说它可以在不重新刷新页面的情况下与服务器通信&#xff0c;…

windows10装windows11的CMD(Terminal)终端

文章目录 一 前言二 安装Terminal三 启动设置成默认启动cmd 一 前言 我装了WSL的LINUX系统&#xff0c;在 windows10 系统下面不方便启动linux&#xff0c;但是Windows11 在cmd 里面就可以打开&#xff0c; 所以找了这个方法 二 安装Terminal 先在windows10微软的商城(Microso…

>>Vue3+pinia+echarts等实现疫情可视化大图

一.>>前言 1.这个项目是在小满实战篇可视化&#xff08;第九章-饼图&#xff09;_哔哩哔哩_bilibili 这一系列课程为基础来做的&#xff0c;真的很感谢小满老师&#xff0c;讲的内容干货满满&#xff0c;暂时解决了手上没有项目的难题。大家可以去观摩一下他的优质课程。…

什么是膨胀卷积/空洞卷积

什么是膨胀卷积/空洞卷积 膨胀卷积&#xff08;Dilated Convolution/Atrous Convolution&#xff09;&#xff08;下面都使用膨胀卷积 这个名词&#xff09; 先来一张图&#xff0c;让大家对于膨胀卷积有个直观的理解&#xff0c;上图左边就是普通卷积&#xff0c;右边是膨胀卷…

外包干了14天,技术退步明显。。。

先说一下自己的情况&#xff0c;本科生&#xff0c;2019年我通过校招踏入了成都一家软件公司&#xff0c;开始了我的职业生涯。那时的我&#xff0c;满怀热血和憧憬&#xff0c;期待着在这个行业中闯出一片天地。然而&#xff0c;随着时间的推移&#xff0c;我发现自己逐渐陷入…

京东按图搜索京东商品(拍立淘) API 返回值说明

京东按图搜索商品&#xff08;拍立淘&#xff09;的API返回值包含了关于通过图片搜索到的京东商品的相关信息。由于我无法提供最新的京东API返回值的确切结构&#xff0c;以下是基于常见API设计原则的一个大致的返回值示例和说明&#xff1a; 调用链接获取详情 item_search_i…

MC10T1S-10BASE-T1S车载以太网转换器

10BASE-T1S车载以太网转换器 为10BASE-T1S车载以太网转换器&#xff0c;支持Multidrop bus line和Point-to-Point。采用的DB9接口类型&#xff0c;支持PLCA。10BASE-T1S是IEEE 802.3cg标准制定的IEEE汽车以太网的最新标准之一&#xff0c;采用UTP这样的一对无屏蔽的双芯电缆进行…

matlab simulink 电力系统同步发电机励磁系统的建模与仿真

1、内容简介 略 77-可以交流、咨询、答疑 电力系统同步发电机励磁系统的建模与仿真 建立MATLAB的同步发电机励磁调节系统仿真模型&#xff0c;最后建立了以PID和PSS为励磁控制方式的同步发电机励磁调节系统数学模型&#xff0c;在Simulink环境下进行了仿真&#xff0c;收到…

C++除了Qt还有什么GUI库?

C除了Qt还有什么GUI库&#xff1f; 先&#xff0c;不要折腾&#xff0c;不要想着用 C 来做 App 类的 GUI 开发。 所以你问用 c gui 库&#xff0c;本来确实有很多&#xff0c;但是经过几十年的沉淀&#xff0c;最后只留下一个 qt quick 和其他特殊需求的库&#xff08;包括 qt…

【Flutter 面试题】Flutter如何进行本地存储和缓存数据?

【Flutter 面试题】Flutter如何进行本地存储和缓存数据&#xff1f; 文章目录 写在前面口述回答补充说明实际案例完整代码示例运行结果详细说明 写在前面 &#x1f64b; 关于我 &#xff0c;小雨青年 &#x1f449; CSDN博客专家&#xff0c;GitChat专栏作者&#xff0c;阿里云…

【火猫TV】LPL春季赛前瞻:Tabe迎战LNG OMG关键一战!

北京时间3月20日&#xff0c;LPL春季赛今天继续进行&#xff0c;今天将会迎来春季赛常规赛第八周第三个比赛日&#xff0c;今天的两场比赛是LNG战队对阵AL战队以及OMG战队对阵BLG战队&#xff0c;今天的两场比赛对于LNG、AL以及OMG战队都是比较重要的&#xff0c;目前三支战队都…

第十二届蓝桥杯省赛CC++ 研究生组-货物摆放

还是整数分解问题,注意n本身也是约数 #include <iostream> int main(){printf("2430");return 0; }#include <iostream> #include<cmath> #include<algorithm> using namespace std; typedef long long ll; const ll n 2021041820210418LL…

QGIS开发笔记(一):QGIS介绍、软件下载和加载shp地图数据Demo

若该文为原创文章&#xff0c;转载请注明原文出处 本文章博客地址&#xff1a;https://hpzwl.blog.csdn.net/article/details/136888334 红胖子网络科技博文大全&#xff1a;开发技术集合&#xff08;包含Qt实用技术、树莓派、三维、OpenCV、OpenGL、ffmpeg、OSG、单片机、软硬…

实现安卓连接阿里云物联网平台(2)

完整工程链接 链接&#xff1a;https://pan.baidu.com/s/1ykcJHPBSKBXVMaMWKoVRvA?pwd8888 提取码&#xff1a;8888 &#xff08;1&#xff09;创建一个新工程 &#xff08;2&#xff09;添加mqtt包的依赖 implementation org.eclipse.paho:org.eclipse.paho.client.mqttv…

MINT: Detecting Fraudulent Behaviors from Time-series Relational Data论文阅读笔记

2. 问题定义 时间序列关系数据&#xff08;Time Series Relation Data&#xff09; 这个数据是存放在关系型数据库中&#xff0c;每一条记录都是泰永时间搓的行为。 更具体地&#xff0c;每条记录表示为 x ( v , t , x 1 , x 2 , … , x m − 2 ) x (v,t,x_1,x_2,\dots,x…

【Unity】UI九宫格

什么是九宫格&#xff1f; 顾名思义&#xff0c;九宫格就是指UI切成9个格子&#xff0c;9个格子可以任意拉伸。 1、3、7、9不拉伸。 2、8水平拉伸。 4、6垂直拉伸。 5既可以水平也可以垂直拉伸。 怎么切九宫格&#xff1f; 选中图片&#xff0c;改成Sprite模式&#xff0c;点…

[flask] flask的基本介绍、flask快速搭建项目并运行

笔记 Flask Flask 本身相当于一个内核&#xff0c;其他几乎所有的功能都要用到扩展&#xff08;邮件扩展Flask-Mail&#xff0c;用户认证Flask-Login&#xff0c;数据库Flask-SQLAlchemy&#xff09;&#xff0c;都需要用第三方的扩展来实现。比如可以用 Flask 扩展加入ORM、…