ble55ing的技术专栏 code analysis ,fuzzing technique and ctf

arm架构初探

2019-07-07
ble55ing

elf

arm架构初探

一直没有涉足过arm呢,走一波

精简指令集

ARM架构是一个32位精简指令集(RISC)处理器架构 ,广泛地使用在许多嵌入式系统设计。具有节能的特点,ARM处理器非常适用于移动通讯领域。相比于x86,ARM往往没有较好的CPU,所以性能相较没有优势;而其流水线指令集的效率会较为优秀,在一些任务相对固定的应用场合其优势就能发挥得淋漓尽致。

寄存器

r0-r3又称为临时工作寄存器,表示可以用来传递参数和返回值,但是不够的话就会用到栈来传递;也称为 a1-a4;callee不需要保存。

r4-r9寄存器可以在函数内部表示局部变量,但如果用到变量的地址,也会类似x86在栈中分配一块;也称为 v1-v6;

r10:sl是栈限制寄存器,当sp递减时不能低于它的值;

r11:fp是栈帧寄存器,和x86的ebp作用类似,用来访问局部变量和参数,而且还保存之前sp的值;

r12:ip,当进入函数时mov ip, sp

 r13是sp寄存器;

r14是 lr 返回地址寄存器;

r15是pc (类似EIP) 寄存器。

参数传递

一般采用B系列指令执行函数的跳转执行,其中BL指令将返回地址存储于LR寄存器,BLX指令除了地址存储于LR寄存器,还对要执行的指令进行判断(ARM or Thumb)。 

在参数传递时,将所有参数看作是存放在连续的内存单元中的字数据。然后,依次将各字数据传送到寄存器R0~R3中,如果参数多于4个,则通过栈进行存储,入栈的顺序与参数顺序相反,即最后一个字数据先入栈。 

局部变量可以存储在寄存器中,也可以有栈来分配。 

函数执行完后,若结果32位的整数时,可以通过寄存器返回(一般使用R0)。 64位整数时,可以通过寄存器R0和R1返回,依次类推(不含浮点运算结果)。最后将之前保存的函数地址赋予到PC(可以是LR,也可以是其他寄存器)。

系统调用

在ARM架构上,所有的系统调用都是通过SWI软中断来实现的,指令如下:  SWI{cond} immed_24,具体的调用号存放在寄存器R7中,调用函数的参数和之前提到的传参方式相同。例如:

exit(0) 

MOV R0,#0  
MOV R7,#7  
SWI #0 

参考文章

https://blog.csdn.net/richard1230/article/details/79727142


Similar Posts

Content