美文网首页
逆向笔记(三)-汇编指令

逆向笔记(三)-汇编指令

作者: KG丿夏沫 | 来源:发表于2021-06-15 08:49 被阅读0次

    汇编指令

    针对汇编来说,汇编指令是必须了解的,而且汇编中汇编指令比较多,但是每一个汇编指令对应的机器码是固定不变的,看下下面的汇编代码

    _A:
        sub sp,sp,#0x10
        mov w8,#0x1e
        str w8,[sp,#0xc]
        mov w9,#0xa
        str w9,[sp,#0x8]
        sub w0,w8,w9
        add sp,sp,#0x10
        ret
    

    之前介绍逆向的时候就说过,可以通过汇编代码反向推算高级语言,所以经过推算后,可以得到以下C代码:

    int A(){
        int a = 30;
        int b = 10;
        return a-b;
    }
    

    那么怎么推算的,汇编里面的指令是什么意思呢?今天我们一起去探索

    sub指令

    sub/subs汇编指令是进行减法运算指令。一般在函数内部第一句就是sub指令,是用来开辟内存空间。之前就说过栈空间是从高地址向低地址扩展的,而且是一块连续的空间,sp之前介绍寄存器的时候就说过是栈顶,所以第一条指令就是sp向低地址移动一段距离,也就是开辟一块栈空间。

    mov指令

    mov指令是数据传输指令,也是基本的编程指令,用于将一个数据从源地址传送到目标地址

    str指令

    str指令是写入操作,将制定数据写入到某个寄存器中

    add指令

    add指令是加法运算指令,经常出现在函数结束后返回前,因为栈空间是高地址向低地址扩展的,所以栈空间使用完毕后释放时就是将sp寄存器地址向高地址移动

    b指令

    b指令是跳转指令,在函数嵌套的时候经常能看见,而且大多数都是bl指令。

    b与bl指令的相同点:都是跳转指令
    b与bl指令的不同点:b指令只是单纯的跳转,跳进函数后,无法回到原来的位置,bl指令是带有lr寄存器地址的跳转,跳入其他函数后,可以根据lr寄存器的内存回到之前的位置进行下一步操作

    ldr指令

    ldr指令是读取指令,从寄存器读取内容的指令

    cmp指令

    cmp指令是比较指令,其内部就是进行减法运算,最后的结果收到cpsr寄存器中NZCV标志位的影响

    b.le指令

    b.le指令是判断是否大于

    b.ne

    b.ne指令是比较是否等于

    b.ge

    b.ge指令是判断是否小于

    b.lt

    b.lt指令是判断是否大于等于

    b.gt

    b.gt指令是判断是否小于等于

    b.ls

    b.ls指令是判断是否无符号大于

    b.ne

    b.ne指令是判断是否无符号等于

    b.hs

    b.hs指令是判断是否无符号小于

    b.lo

    b.lo指令是判断是否无符号大于等于

    b.hi

    b.hi指令是判断是否无符号小于等于

    b.eq

    b.gt指令是比较结果是等于,执行标号,否则不跳转

    ubfx

    ubfx指令是无符号位域提取指令,一般在一些复杂算法中容易出现

    and

    and指令是与运算指令

    orr

    orr指令是或运算指令

    eor

    eor指令是异或运算指令

    stp

    stp指令是入栈指令

    ldp

    ldp指令是出栈指令

    cbz

    cbz指令是运算结果如果为0进行转移指令

    cbnz

    cbnz指令是如果结果为非零就进行转移指令

    ret

    ret指令是返回指令

    相关文章

      网友评论

          本文标题:逆向笔记(三)-汇编指令

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