逆向之汇编(堆栈平衡函数)
一 . 基本概念
函数是什么:
一些指令的集合。如何调用函数:
用 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
逆向之汇编(堆栈平衡函数)相关推荐
- 汇编达人视频学习6(汇编眼中的函数、CALL指令执行函数、堆栈传参、堆栈平衡、外平栈、内平栈)
title: 汇编达人视频学习6 date: 2021年8月4日 15点15分 tags: 汇编达人 categories: 汇编达人 21.汇编眼中的函数 1.什么是函数 函数就是一系列指令的集合, ...
- 从汇编角度理解 ebpesp 寄存器、函数调用过程、函数参数传递以及堆栈平衡
关于函数参数的传递及堆栈指针的变化,一直缺乏系统的认识和了解,各种博客也只是片面的讲解某个局部知识点,并没有全局的把握和对栈的深刻理解.本文试图从汇编以及整体上,讲解函数调用时,堆栈的变化,以及到底是 ...
- C代码+汇编 C的 函数汇编学习分析 rep stos dword ptr [edi]
如分析有误,请在评论区中,指出 谢谢合作 主要是分析C的函数调用在汇编中的执行流程 本章主要是说一下函数调用时堆栈的变化,重点理解部分 C代码 #include"stdafx.h" ...
- ebp 函数堆栈esp_函数参数压栈,栈帧ebp,esp怎样移动的?
压栈一次esp-4,ebp不变 esp是栈顶指针寄存器,堆栈操作只和esp有关 比如有一个函数a,有两个参数,一般是这样的 PUSH 1 参数2压栈,esp-4 PUSH 2 参数1压栈,esp-4 ...
- 20145223《信息安全系统设计基础》 GDB调试汇编堆栈过程分析
20145223<信息安全系统设计基础> GDB调试汇编堆栈过程分析 分析的c语言源码 生成汇编代码--命令:gcc -g example.c -o example -m32 进入gdb调 ...
- GDB调试汇编堆栈过程分析
GDB调试汇编堆栈过程分析 分析过程 .c代码文件 #include<stdio.h>short addend1 = 1;static int addend2 = 2;const stat ...
- GDB调试汇编堆栈过程的学习
GDB调试汇编堆栈过程的学习 分析过程 这是我的C源文件: 1.安装32位兼容包 2.使用gcc - g example.c -o example -m32指令在64位的机器上产生32位汇编,然后使用 ...
- 【汇编语言与计算机系统结构笔记15】子程序设计:调用与返回,保护与恢复寄存器,子程序的参数传递,堆栈平衡,结构伪操作 STRUC
本次笔记内容: 20.子程序设计-1-1 21.子程序设计-1-2 22.子程序设计-1-3 注:我找到了对应内容的课件,请见我于GitHub的CS笔记仓库.因此,为了节省时间,我只记录老师上课强调的 ...
- 逆向之汇编(EBP寻址)
1.寄存器传参和堆栈传参 (1)寄存器 (2)堆栈传参 ESP寻址 2.ESP寻址的缺点 (前提:用堆栈传参) 在堆栈中存些值,ESP(栈顶指针)就会发生变化,于是下面的esp寻址就要更新. 举例: ...
- 操作系统-ucore-lab1 Bootloader启动操作系统 A20 GDT全局描述符 使能和进入保护模式 ELF格式os 8259A中断控制器 8253定时器 函数调用堆栈跟踪函数
操作系统-ucore-lab1 本文详细地址 实验一:系统软件启动过程 参考 重要文件 调用顺序 1. boot/bootasm.S | bootasm.asm(修改了名字,以便于彩色显示)a. 开启 ...
最新文章
- 数据竞赛:记录3天进入比赛Top3%的全过程
- select into from 用法_年轻同事不讲武德,直接怼上MySQL常见SQL的七大错误用法
- php停车场计时收费软件,城市街道停车计时收费系统 路边停车收费软件
- 远程访问及控制(详解)——SSH远程管理及TCP Wrappers 访问控制
- Java学习笔记9-2——JavaWeb
- 重磅!阿里巴巴工程师获得 containerd 社区席位,与社区共建云时代容器标准 1
- Windows安装python,以及python的集成开发环境Pycharm
- Java 错误:找不到或无法加载主类(源文件中含有包名 package)
- 视频分割修整功哪一款视频剪辑软件更好用?
- android vmware 分辨率,android 常见分辨率与DPI对照表
- html 实现页面加载进度,网页加载进度条实现方案
- 乌拉、利用python实现tree命令
- IIS 部署,发布 报错 500.19
- Bootstrap官网的Bootstrap 3 字体图标的使用测试
- MKS Robin nano V3.0主板使用RRF 固件教程
- python做的游戏怎么导到微信_微信跳一跳游戏的脚本-scratch导出到微信-微信小程序是怎么做的...
- 局域网找不到其它电脑
- ecs共享型s6怎么样?
- java 确认邮箱地址的可达性
- 小猪的猪栏文章类目导航