@TOC

简介

上一周打hxp的时候,遇到了一个3dsx的题,题目本身是拿arm架构写的,当我想更改汇编代码从而破解游戏的时候,不得以对每一条想知道的汇编指令进行搜索,加上后面用angr爆破的想法也因为arm退却(这个寒假搞定他,我觉得这会是一个很有用的解题手段),所以化了几个小时简单过了一下指令,且边写边学。

arm简介

精简指令集(RISC)
对于大部分的32位嵌入式都用arm
arm还有很多很多型号
在这里插入图片描述
可以参考这个视频:
ARM那些你得知道的事儿

寄存器

参考
######################
共有37个32位的寄存器
31个通用寄存器
6个状态寄存器
这些不一定可以同时访问,但r0-r14(通用寄存器),pc/r15(程序计数器),一个状态寄存器可以同时被访问
######################
r0-r7未分组寄存器
r8-r14分组寄存器
r15/pc 程序寄存器

r13 常用作堆栈指针sp 类似于rsp
r14/lr 常用作存储返回地址 (link)
r15/pc 当前指令+8个字节 类似于eip+8
r16/cpsr 状态寄存器 类似于flag寄存器

常见指令

算术和逻辑指令

1
2
3
4
5
6
7
8
9
10
11
12
add a,b,c a=b+c                       加法
adc a,b,c a=b+c+进位 进位加法
sub a,b,c a=b-c 减法
sbc a,b,c a=b-c+借位 借位减法
rsb a,b,c a=c-b 反向减法
rsc a,b,c a=c-b+借位 反向借位减法
mov a,b a=b 赋值
mvn a,b a=-b 取反赋值
and a,b,c a=b&c 与
eor a,b,c a=b&c 异或
orr a,b,c a=b|c 或
bic a,b,c 位清除

移位操作

#后面跟常数

1
2
3
4
5
lsl 逻辑坐移
lsr 逻辑右移
asl 算术左移
asr 算数右移
ror 循环右移

在这里插入图片描述

乘法

1
2
mul a,b,c a=b*c 乘法
mla a,b,c,d a=(b*c)+d 累加乘法

比较指令

1
2
3
4
cmp 比较
cmn 取负值比较
teq 异或测试
tst 与测试

装载存储指令

1
2
ldr 将内存数据载入寄存器
str 将寄存器数据放到内存

跳转指令

BL指令在转移到子程序执行之前,将其下一条指令的地址拷贝到R14(LR,链接寄存器)。
由于BL指令保存了下条指令的地址,因此使用指令“MOV PC ,LR”即可实现子程序的返回。

1
2
b 类似于jmp
bl 类似于call

传参方式

r0,r1,r2,r3 四个寄存器 多余的用栈来传参