iOS 安全攻防

汇编-----栈的平衡 && 现场保护

2018-05-07  本文已影响0人  那时J花开

汇编中使用call指令的时候, 需要注意栈的平衡

函数栈平衡, 保证函数调用前后,sp是一致的

assume cs:code, ds:data, ss:stack
stack segment
        db 20 dup(1) ; 定义20个字节作为栈段
stack ends

data segment
        db 20 dup(2)
        str db 'Hello world!$'
data ends

code segment
start:
      mov ax, data
      mov ds, ax
      mov ax, stack
      mov ss, ax

      push 1
      push 2
      call sum  ;相当于函数调用
     ; add sp, 4  ;可以在函数调用完毕进行平栈,外平栈
      mov ax, 4ch
      int 21h
sum: 
      mov bp, sp ;将sp赋值给bp寄存器,bp是专门用来代替sp进行寻址用的寄存器
      sub sp, 20; 预留N个字节的空间给局部变量
      mov ss:[bp - 2], 3
      mov ss:[bp - 4], 4 ;局部变量粗如栈预留空间中
      mov ax, ss:[bp + 2]
      add ax, ss:[bp + 4]
      add ax, ss:[bp - 2]
      add ax, ss:[bp - 4] ;取出局部变量
      mov sp, bp ;将sp回到下一条指令的地址所存放的站地址
      ret 4 ;在函数内部 ret将下一条指令的地址pop完毕后进行平栈, 内平栈
      
code end
end start

函数的局部变量

问题1: 在函数中调用函数, 按照上边的理解, bp会指向下一个函数栈空间中的指令地址,那么ret后, 怎么平栈呢?

问题2: 在函数内部修改了寄存器中的值, 那么别的地方需要用到, 怎么保证数据安全呢?

sum: 
      push bp
      mov bp, sp ;将sp赋值给bp寄存器,bp是专门用来代替sp进行寻址用的寄存器
      sub sp, 20; 预留N个字节的空间给局部变量
;**************业务逻辑
      mov ss:[bp - 2], 3
      mov ss:[bp - 4], 4 ;局部变量粗如栈预留空间中
      mov ax, ss:[bp + 2]
      add ax, ss:[bp + 4]
      add ax, ss:[bp - 2]
      add ax, ss:[bp - 4] ;取出局部变量
;******************业务逻辑
      mov sp, bp ;恢复sp
      pop bp
      ret 4 ;在函数内部 ret将下一条指令的地址pop完毕后进行平栈, 内平栈

以下的汇编代码是一个函数的标准开头和结束

push bp
      mov bp, sp ;将sp赋值给bp寄存器,bp是专门用来代替sp进行寻址用的寄存器
      sub sp, 20; 预留N个字节的空间给局部变量

      ..........

      mov sp, bp ;恢复sp
      pop bp
      ret 4 ;

函数的调用流程

上一篇 下一篇

猜你喜欢

热点阅读