当前位置: 首页 > article >正文

Windows逆向工程入门之栈指令与核心机制深度解析

  • 公开视频 -> 链接点击跳转公开课程
  • 博客首页 -> ​​​链接点击跳转博客主页

目录

Windows逆向工程入门:栈指令与核心机制深度解析

一、栈的核心概念与内存布局

二、栈操作指令详解

1. PUSH 与 POP

2. PUSHA/PUSHAD 与 POPA/POPAD

3. PUSHF/PUSHFD 与 POPF/POPFD

4. CALL 与 RET

三、进阶知识点拓展

1. 调用约定(Calling Convention)

2. 栈溢出与安全防护

3. 调试实战:观察栈操作


Windows逆向工程入门:栈指令与核心机制深度解析


一、栈的核心概念与内存布局

栈(Stack) 是程序运行时内存中的一块线性区域,其操作遵循 LIFO(后进先出) 原则。在x86/x64架构中,栈向低地址方向增长,主要用于存储:

  • 局部变量:函数内部定义的临时变量。

  • 函数参数:调用函数时传递的参数(具体顺序由调用约定决定)。

  • 返回地址CALL 指令执行后保存的下一条指令地址。

  • 保存的寄存器值:如通过 PUSH 或 PUSHA 保存的上下文。

关键寄存器

  • ESP(栈指针):始终指向栈顶,直接反映当前栈操作位置。

  • EBP(基址指针):固定指向当前函数的栈帧基址,用于定位参数和局部变量(尤其在未优化代码中常见)。

栈帧结构示例

高地址
+-----------------+
| 参数n           | ← EBP + 8
| ...             |
| 参数1           | ← EBP + 4
| 返回地址         | ← EBP
| 旧的EBP          | ← EBP当前指向
| 局部变量1        | ← EBP - 4
| 局部变量2        | ← EBP - 8
| ...             |
低地址            ← ESP

二、栈操作指令详解
1. PUSH 与 POP
  • 操作流程

    • PUSH srcESP -= 4(x86)或 RSP -= 8(x64),然后将 src 写入 [ESP]

    • POP dest:从 [ESP] 读取数据到 dest,然后 ESP += 4(x86)或 RSP += 8(x64)。

  • 关键用途

    • 函数调用时的参数传递(如 cdecl 调用约定由调用者清理栈)。

    • 保存/恢复寄存器:例如在函数开头 PUSH EBP 保存旧基址。

  • 栈对齐问题

    • 在64位程序中,某些API(如Windows API)要求栈按16字节对齐。若未对齐,可能导致崩溃。

    • 示例:调用函数前手动调整 ESP 或使用 SUB ESP, 8 对齐。

2. PUSHA/PUSHAD 与 POPA/POPAD
  • PUSHA:按顺序压入 AX, CX, DX, BX, SP, BP, SI, DI(16位)。

  • PUSHAD:压入32位寄存器 EAX, ECX, EDX, EBX, ESP, EBP, ESI, EDI

  • 注意:x64架构中不再支持 PUSHAD,需手动保存寄存器。

3. PUSHF/PUSHFD 与 POPF/POPFD
  • PUSHF:保存16位标志寄存器(FLAGS)。

  • PUSHFD:保存32位EFLAGS(包括进位标志CF、零标志ZF等)。

  • 应用场景:在修改标志位的指令(如 STD 设置方向标志)前保存状态。

4. CALL 与 RET
  • CALL指令

    • 隐式执行 PUSH EIP(将返回地址压栈),然后跳转到目标地址。

    • 示例:CALL 0x401000 → ESP -=4[ESP] = EIPEIP = 0x401000

  • RET指令

    • 弹出栈顶值到 EIP,继续执行。若带参数(如 RET 8),则额外调整 ESP(清理参数)。


三、进阶知识点拓展
1. 调用约定(Calling Convention)
  • cdecl:参数从右向左压栈,调用者清理栈(常见于C语言)。

  • stdcall:参数从右向左压栈,被调用者清理栈(Windows API常用)。

  • fastcall:部分参数通过寄存器传递(如ECX、EDX),剩余参数压栈。

2. 栈溢出与安全防护
  • 栈溢出攻击原理:通过覆盖返回地址,控制程序执行流程(如经典缓冲区溢出)。

  • 防护技术

    • 栈金丝雀(Canary):在栈帧中插入随机值,函数返回前检查其完整性。

    • DEP/NX:标记栈为不可执行,阻止Shellcode运行。

    • ASLR:随机化模块基址,增加预测地址难度。

3. 调试实战:观察栈操作

使用调试器(如x64dbg)分析以下代码:

; 函数调用示例
PUSH 3        ; 参数3
PUSH 2        ; 参数2
PUSH 1        ; 参数1
CALL func
ADD ESP, 12   ; cdecl约定下调用者清理栈func:
PUSH EBP
MOV EBP, ESP
SUB ESP, 8    ; 分配局部变量空间
...
LEAVE         ; 等同于 MOV ESP, EBP; POP EBP
RET
  • 断点分析:观察 CALL 执行后栈的变化,LEAVE 如何恢复栈帧。


相关文章:

Windows逆向工程入门之栈指令与核心机制深度解析

公开视频 -> 链接点击跳转公开课程博客首页 -> ​​​链接点击跳转博客主页 目录 Windows逆向工程入门:栈指令与核心机制深度解析 一、栈的核心概念与内存布局 二、栈操作指令详解 1. PUSH 与 POP 2. PUSHA/PUSHAD 与 POPA/POPAD 3. PUSHF/PUSHFD 与 P…...

腾讯混元hunyuan3d生成模型,本地搭建和使用

腾讯混元hunyuan3d生成模型,本地搭建和使用 腾讯混元hunyuan3d生成模型,本地搭建和使用一. 话不多说,我们直接上本地部署的详细步骤1. 将仓库拉到本地2. 下载2个模型, 注意这里推荐 先使用conda创建环境后在安装modelscope进行下载模型2.1 关于第一个模型我们要在 Hunyuan3D-1 …...

flutter image_cropper插件安装后 打包apk 报错命名空间问题

本篇文章主要讲解,Flutter安装完新依赖打包apk报错 A problem occurred configuring project ‘:image_cropper’. 命名空间问题的解决办法及原因说明。 日期:2025年2月15日 作者:任聪聪 一、报错现象: 报文信息: FAI…...

2025-2-15-4.5 链表(基础题)

文章目录 4.6 链表(基础题)206. 反转链表92. 反转链表II24. 两两交换链表中的节点 4.6 链表(基础题) 有一天我做题忽然发现要把一个数组完全倒着翻过来很费劲,今天看,链表为此而生啊。 206. 反转链表 题目…...

目标检测IoU阈值全解析:YOLO/DETR模型中的精度-召回率博弈与工程实践指南

一、技术原理与数学本质 IoU计算公式: IoU \frac{Area\ of\ Overlap}{Area\ of\ Union} \frac{A ∩ B}{A ∪ B}阈值选择悖论: 高阈值(0.6-0.75):减少误检(FP↓)但增加漏检(FN↑…...

免费大模型网站

腾讯元宝 腾讯元宝 秘塔搜索 秘塔搜索 超算互联网 超算互联网回答速度很慢 Chatbot Arena Chatbot Arena 大模型竞技场。...

【ISO 14229-1:2023 UDS诊断全量测试用例清单系列:第三节】

ISO 14229-1:2023 UDS诊断服务测试用例全解析(安全访问0x27服务) 作者:车端域控测试工程师 更新日期:2025-02-12 关键词:UDS安全访问、0x27服务、ISO 14229-1:2023、ECU安全验证 一、服务概述 安全访问服务&#xff0…...

macOS部署DeepSeek-r1

好奇,跟着网友们的操作试了一下 网上方案很多,主要参考的是这篇 DeepSeek 接入 PyCharm,轻松助力编程_pycharm deepseek-CSDN博客 方案是:PyCharm CodeGPT插件 DeepSeek-r1:1.5b 假设已经安装好了PyCharm PyCharm: the Pyth…...

java八股文-mysql

1. 索引 1.1 什么是索引 索引(index)是帮助Mysql高效获取数据的数据结构(有序).提高数据的检索效率,降低数据库的IO成本(不需要全表扫描).通过索引列对数据进行排序,降低数据排序成本,降低了CPU的消耗. 1.2 mysql索引使用的B树? 1. 没有使用二叉树,最坏情况o&…...

YOLO11环境搭建CUDA12.6

1.安装CUDA和cuDNN 1.1安装CUDA 1.1.1查看当前你的电脑显卡支持的最高CUDA版本,后面的安装不能超过它 通过命令的方式查看 输入nvidia-smi 1.1.2 下载CUDA 官网地址:CUDA Toolkit Archive | NVIDIA Developer 选择cuda_12.6.3 下载完成后,如下: 安装,一直下一步即可:…...

OpenEuler学习笔记(三十二):在OpenEuler上搭建项目管理平台

在OpenEuler上搭建一个支持网页和手持访问、且支持用户功能自定义的项目管理平台,可以选择多种开源工具。以下是基于 Redmine 的搭建方案,Redmine 是一个灵活的项目管理工具,支持网页和移动端访问,并且可以通过插件扩展功能。 1.…...

LabVIEW中的icon.llb 库

icon.llb 库位于 C:\Program Files (x86)\National Instruments\LabVIEW 2019\vi.lib\Platform 目录下,是 LabVIEW 系统中的一个重要库。它的主要功能是与图标相关的操作,提供了一些实用的 VI 用于处理 LabVIEW 图标的显示、修改和设置。通过该库&#x…...

React Hooks 的两个坑点

React Hooks 使用注意事项 Area: Hooks Date: February 10, 2025 Important: 🌟🌟🌟 React Hooks 注意事项 要点: useState 的初始化值 只在第一次渲染时计算,并且这个值不会随着组件重新渲染而更新。useEffect 可…...

C语言的字符串偏移小记

通过C的指针&#xff0c;我们可以遍历一个很长的字符串。我们针对这个字符串可以按照字符串里面的终止符做切分。 首先我们来看下面的一段代码&#xff1a; #include <stdio.h> #include <stdlib.h> #include <stdio.h> #include <string.h>const ch…...

Python学习心得正则表达式及re模块的使用

一、正则表达式定义以及正则表达式的构成&#xff1a; 1.什么式正则表达式&#xff1a; 正则表达式&#xff1a;是一个比较特殊的字符序列&#xff0c;能够帮助用户检查一个字符串是否符合某种特殊的模式。 2.正则表达式的构成&#xff1a; 正则表达式是由元字符和限定字符…...

Oracle启动与关闭(基础操作)

11g读取参数文件的顺序 9i之前&#xff0c;只有静态参数文件pfile文件。 9i开始&#xff0c;引入了动态参数文件spfile文件。 Windows&#xff1a; %ORACLE_HOME%\database SPFILEORCL就是动态参数文件 Linux&#xff1a; $ORACLE_HOME/dbs 11g中&#xff0c;启动数据库。…...

第二月:学习 NumPy、Pandas 和 Matplotlib 是数据分析和科学计算的基础

以下是一个为期 **1 个月&#xff08;30 天&#xff09;**的详细学习计划&#xff0c;精确到每天的学习内容和练习作业&#xff0c;帮助你系统地掌握 NumPy、Pandas 和 Matplotlib 的核心功能。 第 1 周&#xff1a;NumPy 基础 Day 1&#xff1a;NumPy 简介与数组创建 学习内…...

AI 语言模型发展史:统计方法、RNN 与 Transformer 的技术演进

引言 自然语言处理&#xff08;NLP&#xff09;是 AI 领域的重要分支&#xff0c;而语言模型&#xff08;Language Model, LM&#xff09;是 NLP 的核心技术。语言模型经历了从 统计方法 到 RNN&#xff08;循环神经网络&#xff09;&#xff0c;再到 Transformer 的演进&…...

新版电脑通过wepe安装系统

官方下载链接 WIN10下载 WIN11下载 微PE 启动盘制作 1&#xff1a;选择启动盘的设备 2&#xff1a;选择对应的U盘设备&#xff0c;点击安装就可以&#xff0c;建议大于8g 3&#xff1a;在上方链接下载需要安装的程序包&#xff0c;放入启动盘&#xff0c;按需 更新系统 …...

Jmeter断言、关联、录制脚本

Jmeter断言 断言&#xff1a;让程序自动判断预期结果和实际结果是否一致 提示: Jmeter在请求的返回层面有个自动判断机制&#xff08;响应状态码 2xx:成功&#xff0c;4xx/5xx:失败&#xff09;但是请求成功了&#xff0c;并不代表结果一定正确&#xff0c;因此需要检测机制提…...

29、深度学习-自学之路-深入理解-NLP自然语言处理-做一个完形填空,让机器学习更多的内容程序展示

import sys,random,math from collections import Counter import numpy as npnp.random.seed(1) random.seed(1) f open(reviews.txt) raw_reviews f.readlines() f.close()tokens list(map(lambda x:(x.split(" ")),raw_reviews))#wordcnt Counter() 这行代码的…...

SpringBoot速成(12)文章分类P15-P20

1.新增文章分类 1.Postman登录不上&#xff0c;可以从头registe->login一个新的成员:注意&#xff0c;跳转多个url时&#xff0c;post/get/patch记得修改成controller类中对应方法上写的 2.postman运行成功&#xff1a; 但表中不更新&#xff1a;细节有问题&#xff1a; c是…...

RedHat8安装postgresql15和 postgis3.4.4记录及遇到的问题总结

安装包对照版本参考 UsersWikiPostgreSQLPostGIS – PostGIS 如果Red Hat系统上有旧版本的PostgreSQL需要卸载 在较新的Red Hat版本&#xff0c;使用dnf包管理器卸载&#xff1a;sudo dnf remove postgresql-server postgresql 旧版本&#xff0c;使用yum包管理器卸载 sudo y…...

深入解析计算机网络请求头:常见类型与安全性影响

目录 1. Host 2. User-Agent 3. Cookie 4. Referer&#xff08;或 Referrer&#xff09; 5. Authorization 6. Content-Type 7. Content-Length 8. Origin 9. X-Forwarded-For (XFF) 10. Upgrade-Insecure-Requests 11. X-Frame-Options 12. Cache-Control 13. Ac…...

VisoMaster整合包及汉化

VisoMaster是个图片及视频换脸工具&#xff0c;速度快&#xff0c;性能十分强大。 VisoMaster安装有2种方式&#xff0c;根据官网指引安装也十分简单&#xff0c;在此就不重复&#xff0c;只说说安装过程中要注意的事项&#xff1a; 1、自动安装&#xff1a;需要在网络十分畅…...

从安装软件到flask框架搭建可视化大屏(二)——创建一个flask页面,搭建可视化大屏,零基础也可以学会

附录&#xff1a;所有文件的完整代码 models.py # models/models.py from flask_sqlalchemy import SQLAlchemydb SQLAlchemy()class User(db.Model):__tablename__ user # 显式指定表名为 userid db.Column(db.Integer, primary_keyTrue)username db.Column(db.String(…...

【mybatis】基本操作:详解Spring通过注解和XML的方式来操作mybatis

mybatis 的常用配置 配置数据库连接 #驱动类名称 spring.datasource.driver-class-namecom.mysql.cj.jdbc.Driver #数据库连接的url spring.datasource.urljdbc:mysql://127.0.0.1:3306/mybatis_test characterEncodingutf8&useSSLfalse #连接数据库的名 spring.datasourc…...

[JVM篇]垃圾回收器

垃圾回收器 Serial Seral Old PartNew CMS(Concurrent Mark Sweep) Parallel Scavenge Parallel Old G1 ZGC...

DeepSeek专题:DeepSeek-V1核心知识点速览

AIGCmagic社区知识星球是国内首个以AIGC全栈技术与商业变现为主线的学习交流平台&#xff0c;涉及AI绘画、AI视频、大模型、AI多模态、数字人以及全行业AIGC赋能等100应用方向。星球内部包含海量学习资源、专业问答、前沿资讯、内推招聘、AI课程、AIGC模型、AIGC数据集和源码等…...

Ubuntu24.04更新国内源

24.04 源文件地址 已经更换为 /etc/apt/sources.list.d/ubuntu.sources sudo vim /etc/apt/sources.list.d/ubuntu.sources把内容替换为 # 阿里云 Types: deb URIs: http://mirrors.aliyun.com/ubuntu/ Suites: noble noble-updates noble-security Components: main restric…...