iOS逆向与安全11.2 函数本质
2019-07-18 本文已影响0人
looha
栈
栈:是一种具有特殊的访问方式的存储空间(先进后出,后进先出, Last In Out Firt,LIFO)
![](https://img.haomeiwen.com/i1902357/76f6e2f349767a16.jpg)
push 操作 栈顶向上移动
pop 操作 栈顶向下移动
![](https://img.haomeiwen.com/i1902357/e7cb626340bc0c91.png)
a 和 b 在栈中,a 和 b所指向地址存储得值在堆中,所谓大堆小栈
![](https://img.haomeiwen.com/i1902357/64594733b540636e.png)
c 先出栈,b a 后出栈
SP和FP寄存器
-
sp寄存器在任意时刻会保存我们栈底的地址。开始的位置
-
fp寄存器也称为x29寄存器属于通用寄存器,但是在某些时刻我们利用它保存栈底的地址!
注意:ARM64开始,取消32位的 LDM,STM,PUSH,POP指令! 取而代之的是ldr\ldp str\stp 读\写
ARM64里面 对栈的操作是16字节对齐的!!
内存读写指令
注意:读/写 数据是都是往高地址读/写
-
str(store register)指令
将数据从寄存器中读出来,存到内存中. 入栈
-
ldr(load register)指令
将数据从内存中读出来,存到寄存器中 出栈
此ldr 和 str 的变种ldp 和 stp 还可以操作2个寄存器.
-
堆栈操作练习 函数调用栈
.text
.global _A,_B,_suma
_A:
mov x0,#0xaaaa
//str x30,[sp,#-0x10]!
sub sp,sp,#0x10 //拉伸栈空间
str x30,[sp]
bl _B
mov x0,#0xaaaa
ldr x30,[sp],#0x10
ret
_B:
sub sp,sp ,#0x20 栈空间拉伸
stp x0,x1 [sp,#x10] 操作
ldp x1,x0,[sp,#x10] 操作
add sp,sp,#0x20 栈空间恢复
mov x0,#0xbbbb
ret
_suma:
add x0,x0,x1
ret
栈平衡
![](https://img.haomeiwen.com/i1902357/8e17cbe041d54653.png)
![](https://img.haomeiwen.com/i1902357/d1a7c3a1baef1869.png)
![](https://img.haomeiwen.com/i1902357/62000a1c2d38983c.png)
sub sp, sp, #0x20 ;拉伸栈空间32个字节
stp x0, x1, [sp, #0x10] ;sp往上加16个字节,存放x0 和 x1
ldp x1, x0, [sp, #0x10] ;将sp偏移16个字节的值取出来,放入x1 和 x0