call与retn指令

一. call指令

  1. 将call指令下一跳指令压入栈中
  2. jmp跳转到call指令的地址

一个特殊的运用是call $+5

首先要清楚\(是intel汇编格式中的一个预定义符号,表示当前指令所在的地址偏移,那么\)+5就表示是当前地址加5,加上call指令的长度一般为5,即$+5就是下一条指令。

call $+5
pop ebp

1、call将"pop ebp"指令地址push到栈中
2、跳转到"pop ebp"执行
3、"pop ebp"将之前call push进栈的值弹出到ebp中
4、ebp中的值为"pop ebp"指令的地址

二. retn指令

  1. pop指令将栈顶元素弹出存储
  2. jmp跳转到该栈顶元素地址
  3. retn n;表示再前两步操作的基础上加上esp+=n,用于实现堆栈平衡,这里一般的平衡的是压入栈的参数。

需要关注的是retn指令所在的位置一定要是对应call指令所压入地址的位置。

posted @ 2023-08-15 09:54  ONE_ZJ  阅读(164)  评论(0编辑  收藏  举报