windows二进制安全零基础(二)

文章目录

  • 栈(The Stack)
  • 调用约定(Calling Conventions)
  • 函数返回机制


在x86架构中,栈(Stack)是一个非常重要的内存区域,它用于支持线程的短期数据需求,如函数调用、局部变量存储和程序控制信息。下面是对栈和调用约定的详细介绍:

栈(The Stack)

栈是一种后进先出(LIFO)的数据结构,CPU通过专用的PUSH和POP汇编指令来操作栈。当线程执行时,它会从程序映像或动态链接库(DLLs)中执行代码。每个运行中的线程都有自己的栈,以支持多线程的独立执行。

  • PUSH:将数据压入栈顶。
  • POP:从栈顶弹出数据。

栈的主要用途包括:

  • 函数调用:存储函数的返回地址,以便函数执行完毕后能够返回到正确的代码位置。
  • 局部变量:存储函数内部声明的局部变量。
  • 程序控制信息:存储函数调用时的上下文信息,如寄存器的值。

调用约定(Calling Conventions)

调用约定定义了函数如何接收参数以及如何返回结果。x86架构支持多种调用约定,它们在实现上的差异包括参数和返回值的传递方式(使用CPU寄存器、压入栈中或两者结合)、传递顺序、调用前后栈的准备和清理方式,以及被调用函数需要为调用者保留哪些CPU寄存器。

常见的x86调用约定包括:

  • cdecl:由调用者清理栈。通常用于C语言函数,允许函数有可变数量的参数。
  • stdcall:由被调用者清理栈。通常用于Windows API函数。
  • fastcall:前两个参数(如果有的话)通过寄存器传递,其余参数通过栈传递。用于快速函数调用。
  • thiscall:通常用于C++成员函数。第一个参数(this指针)通过ECX寄存器传递,其余参数通过栈传递。

调用约定的选择通常由编译器决定,但在某些情况下,程序员可以在函数级别指定特定的调用约定。这可以通过函数声明时的调用约定关键字来实现。

调用约定的选择对程序的性能和兼容性有重要影响。例如,使用寄存器传递参数可以减少栈操作,从而提高函数调用的速度。而不同的调用约定也可能影响函数之间的接口兼容性,因此在跨模块调用时需要特别注意调用约定的一致性。


在x86架构中,函数返回机制和CPU寄存器是理解程序执行流程的关键。下面是对这些概念的详细解释:

函数返回机制

当线程中的代码调用一个函数时,它必须知道函数完成后返回到哪个地址。这个“返回地址”(连同函数的参数和局部变量)存储在栈上。这些数据的集合与一个函数调用相关联,并存储在栈内存的一个部分,称为栈帧(stack frame)。栈帧是函数调用期间用于存储所有必要信息的数据结构。

一个典型的栈帧可能包含以下内容:

  • 返回地址:函数执行完毕后,控制权返回到此地址。
  • 参数:调用函数时传递的参数。
  • 局部变量:函数内部声明的变量。
  • 旧的基指针(EBP):用于指向当前栈帧的开始位置。

当函数结束时,返回地址从栈中取出,用于将执行流恢复到调用函数。

为了执行高效的代码,CPU维护并使用一系列寄存器。在32位架构中,这些寄存器通常是32位的。寄存器是CPU内部的小型、极高速的存储位置,数据可以在这里高效地读取或操作。

在x86架构中,有九个主要的32位寄存器,包括:

  • EAX:累加器,用于存储函数返回值。
  • EBX:基址寄存器,通常用于存储数据段的地址。
  • ECX:计数器,用于循环和字符串操作。
  • EDX:数据寄存器,用于I/O操作和与EAX一起存储大数值。
  • ESI:源索引寄存器,用于字符串和数组操作。
  • EDI:目标索引寄存器,用于字符串和数组操作。
  • ESP:栈指针,指向栈顶。
  • EBP:基指针,用于访问栈帧中的变量。
  • EIP:指令指针,存储下一条要执行的指令的地址。

这些寄存器的名称源自16位架构,并在32位(x86)平台出现时进行了扩展,这就是寄存器缩写中字母“E”的来源(表示“扩展”)。每个寄存器可以包含一个32位值(允许值在0到0xFFFFFFFF之间),或者在相应的子寄存器中包含16位或8位值,如EAX寄存器的AX、AH和AL子寄存器所示。

在CPU级别,函数调用和返回涉及到以下几个步骤:

  1. 函数调用

    • 使用CALL指令调用函数时,CPU自动将下一条指令的地址(返回地址)推入栈中。
    • 控制权转移到函数的起始地址。
  2. 函数执行

    • 函数可能使用PUSHPOP指令来保存和恢复寄存器的值。
    • 局部变量和参数可以通过修改ESP(栈指针)来在栈上分配空间。
  3. 函数返回

    • 使用RET指令从栈中弹出返回地址,并将其赋值给EIP(指令指针)。
    • 控制权返回到调用函数,继续执行。

理解这些机制对于深入理解程序如何在底层工作至关重要,尤其是在调试和性能优化时。

ESP - 栈指针

正如之前提到的,栈用于存储数据、指针和参数。由于栈是动态的,并且在程序执行过程中不断变化,栈指针ESP通过存储一个指向栈上最近引用位置(栈顶)的指针来“跟踪”它。
指针是对内存中地址(或位置)的引用。当我们说一个寄存器“存储一个指针”或“指向”一个地址时,这基本上意味着该寄存器正在存储那个目标地址。

EBP - 基指针

由于在执行线程期间栈不断变化,函数定位其栈帧可能变得困难,栈帧存储了所需的参数、局部变量和返回地址。基指针EBP通过存储一个指向函数被调用时栈顶的指针来解决这个问题。通过访问EBP,函数在执行期间可以轻松引用其栈帧中的信息(通过偏移量)。

EIP - 指令指针

EIP,指令指针,是我们目的中最重要的寄存器之一,因为它总是指向下一个要执行的代码指令。由于EIP基本上指导了程序的流程,因此在利用任何内存破坏漏洞(如缓冲区溢出)时,它是攻击者的主要目标。

2.2 Windows调试器简介

现在我们已经理解了x86架构的基本概念,是时候探索调试工具了。

在Windows上有几个可用的调试程序。OllyDbg和Immunity Debugger因其用户友好的界面而在逆向工程和漏洞开发领域广为人知。Immunity Debugger最初是OllyDbg的一个分支,但现在已经超越了OllyDbg的功能。

尽管这些程序使用方便,虽然存在一个针对64位的OllyDbg的开源实现,但它并不提供与WinDbg相同的功能或支持。

WinDbg也是我们首选的调试器,因为它可以在用户模式和内核模式下进行调试,这使其成为开发在Windows上利用的任何类型漏洞的最佳选择。WinDbg作为软件开发工具包(SDK)、Windows驱动程序开发工具包(WDK)和Windows调试工具的一部分,免费提供。

微软发布了一个名为WinDbg Preview的WinDbg版本。它具有更直观的界面以及额外的功能,如时间旅行调试和用于脚本支持的JavaScript API。然而,WinDbg Preview仅在Windows 10周年纪念版(1607/RS1)及更高版本上工作。

调试器是一个计算机程序,它被插入到目标应用程序和CPU之间,原则上,它就像一个代理。调试器允许开发者暂停程序的执行、单步执行代码、检查和修改程序的状态,以及执行其他各种诊断任务,从而帮助开发者理解和修复程序中的错误或异常行为。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/917112.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

173. 二叉搜索树迭代器【 力扣(LeetCode) 】

文章目录 零、原题链接一、题目描述二、测试用例三、解题思路四、参考代码 零、原题链接 173. 二叉搜索树迭代器 一、题目描述 实现一个二叉搜索树迭代器类BSTIterator ,表示一个按中序遍历二叉搜索树(BST)的迭代器: BSTIterato…

【lamafactory BLEU ROUGLE L评测】

1、BLEU/ROUGLE评测界面 2、这个是用BLEU 和ROUGL来评测 目录:saves/Qwen2-7B-Chat/lora/eval_2024-11-14-16-28-19/ 在saves文件夹 生成的文件如下 all_results.json文件 说明模型在这个测试集上是不好的 3、可以查看预测结果的文件 predict_result.json

前端开发中常用的包管理器(npm、yarn、pnpm、bower、parcel)

文章目录 1. npm (Node Package Manager)2. Yarn (Yarn Package Manager)3. pnpm4. Bower5. Parcel总结 前端开发中常用的包管理器主要有以下几个: 1. npm (Node Package Manager) 简介: npm 是 Node.js 的默认包管理器,也是最广泛使用的包…

Python爬虫项目 | 一、网易云音乐热歌榜歌曲

文章目录 1.文章概要1.1 实现方法1.2 实现代码1.3 最终效果 2.具体讲解2.1 使用的Python库2.2 代码说明2.2.1 创建目录保存文件2.2.2 爬取网易云音乐热歌榜单歌曲 2.3 过程展示 3 总结 1.文章概要 学习Python爬虫知识,实现简单的一个小案例,网易云音乐热…

SHELL脚本(Linux)

声明 学习视频来自 B 站UP主泷羽sec,如涉及侵权马上删除文章。 笔记的只是方便各位师傅学习知识,以下网站只涉及学习内容,其他的都与本人无关,切莫逾越法律红线,否则后果自负。 ✍🏻作者简介:致…

reduce-scatter:适合分布式计算;Reduce、LayerNorm和Broadcast算子的执行顺序对计算结果的影响,以及它们对资源消耗的影响

目录 Gather Scatter Reduce reduce-scatter:适合分布式计算 Reduce、LayerNorm和Broadcast算子的执行顺序对计算结果的影响,以及它们对资源消耗的影响 计算结果理论正确性 资源消耗方面 Gather 这个也很好理解,就是把多个进程的数据拼凑在一起。 Scatter 不同于Br…

arkUI:水果选择与管理:基于 ArkUI 的长按编辑功能实现

水果选择与管理:基于 ArkUI 的长按编辑功能实现 1 主要内容说明2 相关内容2.1 相关内容2.1.1 源码1内容的相关说明2.1.1.1 数据结构与状态管理2.1.1.2 添加水果功能2.1.1.3 水果列表展示2.1.1.4 长按进入编辑模式2.1.1.5 复选框的多选功能2.1.1.6 删除水果功能2.1.1…

(时序论文阅读)TimeMixer: Decomposable Multiscale Mixing for Time Series Forecasting

来源论文iclr2024 论文地址:https://arxiv.org/abs/2405.14616 源码地址: https://github.com/kwuking/TimeMixer 背景 数据是有连续性,周期性,趋势性的。我们这篇文章主要围绕的是用MLP结构来预测数据的周期性具体为&#xff…

聊天服务器(8)用户登录业务

目录 登录状态业务层代码数据模型层代码记录用户的连接信息以及线程安全问题客户端异常退出业务 登录状态 登录且状态变为online 业务层代码 #include "chatservice.hpp" #include "public.hpp" #include <string> #include <muduo/base/Loggi…

18.UE5怪物视野、AI感知、攻击范围、散弹技能

2-20 怪物视野、AI感知、攻击范围、散弹技能_哔哩哔哩_bilibili 目录 1.AI感知组件 2.AI感知更新的函数 3.攻击范围 4.散弹技能 4.1创建发射物 4.2创建远程攻击方式 4.3散弹自定义事件的实现 4.4动画通知实现攻击 1.AI感知组件 为怪物蓝图添加AI感知组件&#xff0c;…

单片机智能家居火灾环境安全检测

目录 前言 一、本设计主要实现哪些很“开门”功能&#xff1f; 二、电路设计原理图 电路图采用Altium Designer进行设计&#xff1a; 三、实物设计图 四、程序源代码设计 五、获取资料内容 前言 在现代社会&#xff0c;火灾安全始终是人们关注的重点问题。随着科技的不…

安全见闻1-5

涵盖了编程语言、软件程序类型、操作系统、网络通讯、硬件设备、web前后端、脚本语言、病毒种类、服务器程序、人工智能等基本知识&#xff0c;有助于全面了解计算机科学和网络技术的各个方面。 安全见闻1 1.编程语言简要概述 C语言&#xff1a;面向过程&#xff0c;适用于系统…

【计算机网络】TCP协议特点3

心跳机制 什么是心跳机制 心跳机制是在计算机系统、网络通信和许多其他技术领域广泛应用的一种机制&#xff0c;用于检测两个实体之间的连接是否仍然活跃&#xff0c;或者设备是否还在正常运行。就是每隔一段时间发送一个固定的消息给服务端&#xff0c;服务端回复一个固定…

HarmonyOs DevEco Studio小技巧31--画布组件Canvas

那天我们用画布实现了文字颜色的渐变&#xff0c;实际上画布还有很多好玩的功能&#xff0c;接下来让我们一起试一下画布怎么玩 Canvas 提供画布组件&#xff0c;用于自定义绘制图形。 接口 Canvas Canvas(context?: CanvasRenderingContext2D | DrawingRenderingContext…

蓝桥杯每日真题 - 第10天

题目&#xff1a;&#xff08;班级活动&#xff09; 题目描述&#xff08;14届 C&C B组C题&#xff09; 解题思路&#xff1a; 题目要求我们找到最小的修改次数&#xff0c;使得任意一名同学的 ID 都与另一名同学的 ID 不相同。可以总结出这是一个寻找“重复数字最少修改…

HTML5实现俄罗斯方块小游戏

文章目录 1.设计来源1.1 主界面1.2 皮肤风格1.2 游戏中界面1.3 游戏结束界面 2.效果和源码2.1 动态效果2.2 源代码 源码下载 作者&#xff1a;xcLeigh 文章地址&#xff1a;https://blog.csdn.net/weixin_43151418/article/details/143788449 HTML5实现俄罗斯方块小游戏&#x…

外网访问 WebDav 服务

从外部网络环境&#xff08;比如异地和家中网络&#xff09;来访问公司内网的 WebDav 服务&#xff08;基于 IIS &#xff09;并映射成本地虚拟磁盘。 步骤如下 第一步 在公司内网的电脑上设置 webDav。 1&#xff0c;找到【控制面板】&#xff0c;双击进入。 2&#xff0c…

深度学习每周学习总结J5(DenseNet-121 +SE 算法实战与解析 - 猴痘识别)

&#x1f368; 本文为&#x1f517;365天深度学习训练营 中的学习记录博客&#x1f356; 原作者&#xff1a;K同学啊 | 接辅导、项目定制 0. 总结 数据导入及处理部分&#xff1a;本次数据导入没有使用torchvision自带的数据集&#xff0c;需要将原始数据进行处理包括数据导入…

【玩具蛇——DFS】

题目 代码 #include <bits/stdc.h> using namespace std; int g[5][5]; int dx[] {0, 0, -1, 1}, dy[] {-1, 1, 0, 0}; int ans; void dfs(int x, int y, int t) {g[x][y] t;if (t > 16){ans;g[x][y] 0;return;}for (int i 0; i < 4; i){int nx x dx[i], n…

STM32 串口输出调试信息

软硬件信息 CubeMX version 6.12.1Keil uVision V5.41.0.0 注意 串口有多种&#xff1a; TTL232485 串口的相关知识&#xff1a; 01-【HAL库】STM32实现串口打印&#xff08;printf方式) &#xff0c; 内含 TTL 和 232 区别。 我把 232 串口连进 STM32 串口助手收到的信息…