iOS逆向与安全11.2 函数本质
2019-07-18 本文已影响0人
looha
栈
栈:是一种具有特殊的访问方式的存储空间(先进后出,后进先出, Last In Out Firt,LIFO)
15193998892055.jpg
push 操作 栈顶向上移动
pop 操作 栈顶向下移动
a 和 b 在栈中,a 和 b所指向地址存储得值在堆中,所谓大堆小栈
image.pngc 先出栈,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
栈平衡
拉伸栈空间 函数调用完毕,栈空间归位 栈空间拉伸得到的待覆写空间sub sp, sp, #0x20 ;拉伸栈空间32个字节
stp x0, x1, [sp, #0x10] ;sp往上加16个字节,存放x0 和 x1
ldp x1, x0, [sp, #0x10] ;将sp偏移16个字节的值取出来,放入x1 和 x0