iOS逆向与安全11.2 函数本质

栈:是一种具有特殊的访问方式的存储空间(先进后出,后进先出, Last In Out Firt,LIFO)


15193998892055.jpg

push 操作 栈顶向上移动
pop 操作 栈顶向下移动

image.png

a 和 b 在栈中,a 和 b所指向地址存储得值在堆中,所谓大堆小栈

image.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

栈平衡

拉伸栈空间
函数调用完毕,栈空间归位
栈空间拉伸得到的待覆写空间
sub    sp, sp, #0x20    ;拉伸栈空间32个字节
stp    x0, x1, [sp, #0x10] ;sp往上加16个字节,存放x0 和 x1
ldp    x1, x0, [sp, #0x10] ;将sp偏移16个字节的值取出来,放入x1 和 x0

你可能感兴趣的:(iOS逆向与安全11.2 函数本质)