美文网首页iOS安全
iOS逆向(三)状态寄存器&还原高级代码

iOS逆向(三)状态寄存器&还原高级代码

作者: Tycool | 来源:发表于2018-05-02 10:06 被阅读0次

    回顾:

    bl 跳转,将下一条要执行的指令放入lr(X30)寄存器
    ret 返回lr所保存的地址执行代码
    pc 指向要执行的代码地址
    sp 指向栈,栈平衡(函数调用后,将拉伸的栈空间平衡sub,add)
    函数调用会开辟一段栈空间(函数的局部变量、参数、寄存器的保护)
    参数放在X0 - X7(个数有关,与数据类型有关 浮点、结构体...),多余的入栈
    函数嵌套调用,死递归,不断开辟空间 -> 内存溢出

    状态寄存器 CPSR

    CPU内部的寄存器中,有一种特殊的寄存器(不同的处理器,个数和结构可能不同),在ARM中,被称为状态寄存器CPSR(current program status register),其他寄存器是用来存放数据的,而CPSR是按位起作用的,即它的每一位都有专门的含义,记录特定的信息。
    注:CPSR是32位的

    状态寄存器.png

    N(Negative)

    符号标志位,记录相关指令执行后,结果是否为负,负:1 非负:0

    Z(Zero)

    0标志位,记录相关指令执行后,结果是否为0,0:1 非0:0

    C(Carry)

    进位标志位,一般情况下,进行无符号数的运算。
    加法:当结果产生了进位时(无符号数溢出),C=1,否则C=0
    减法:当运算时产生了借位时(无符号数溢出),C=0,否则C=1

    • 进位:当两个数相加时,可能产生从最高有效位向更高位的进位,由于这个进位值在32位中无法保存,CPU在运算时并不丢弃这个进位值,而是记录在一个特殊的寄存器的某一位上,ARM就用C位来记录这个进位值。
    • 借位:两个数做减法时,可能向更高位借位,用C位来标记借位,C=0

    V(Overflow)

    溢出标志位,在进行有符号数运算时,如果超过了机器所表示的范围,称为溢出。

    • 正数 + 正数 = 负数 溢出
    • 负数 + 负数 = 正数 溢出
    • 正数 + 负数 不可能溢出

    相关文章

      网友评论

        本文标题:iOS逆向(三)状态寄存器&还原高级代码

        本文链接:https://www.haomeiwen.com/subject/kbsslftx.html