逆向之汇编(堆栈平衡&&函数)

一 . 基本概念

  1. 函数是什么:
    一些指令的集合。

  2. 如何调用函数:
    用 call指令

  • 为什么:(对比jmp指令)
  • 参数与返回值:

举例:编写一个函数,得到任意两个整数的和
在这里插入图片描述
绿色框框:函数(整数相加),用EAX传递返回值
紫色框框:用ECX,EDX传递参数

二. 用堆栈的方式传递参数(实现堆栈平衡的两个方式)

  • 堆栈平衡是什么
    经过一系列变化后(参数、函数等的临时存储),堆栈里的栈顶指针依旧不变【ESP的值依旧不变】

1.(函数内平衡)保证ret这条指令前,ESP是压入函数的初始值

举例:

如果有10个参数怎么办?——没有那么多寄存器。

  • 向堆栈push1~5个数
  • 接着call指令

在(call指令对应的)特定地址依次:

  • ADD EAX,DWORD PTR DS:[ESP+4]
  • ADD EAX,DWORD PTR DS:[ESP+8]
  • …(共5个)
    RET(返回栈顶所知内存,即call指令下面的内存)

这里的+4+8…是因为现在栈顶是call指令下面的内存编号。

2.(函数外)在函数执行完毕后,要平衡参数导致的堆栈变化

在这里插入图片描述
上图中,push的1,2是临时参数,堆栈将它们调用完了,并没有释放,造成垃圾数值的堆积。

解决方式:

  • 外平栈
    在函数外,让ESP指向原来(push前)的位置
    在这里插入图片描述
  • 内平栈
    在函数内:

ret 8

等价于上面的
add esp,8
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/weixin_51325053/article/details/117930940