通过call指令来学习指令摘要表的细节

E8 cw
cw 表示E8后面跟随2 字节 (什么数不知道)
rel16 指在与指令同一代码段内的相对地址偏移
D ,指向Instruction Operand Encoding 表中的D列, 他告诉我们 操作数1 是一个0FFSET
N.S. 在64位模式下,某些指令需要使用“地址覆盖前缀”(address override prefix),但这并不被所有处理器支持。如果在64位模式下使用地址覆盖前缀,可能会导致特定处理器型号的执行行为出现不一致或错误。
Valid 表示兼容模式和传统模式下,这个指令是有效的
Description: 调用指令”(Call)是一种“近跳”(near jump)指令,它的目标地址是相对于下一条指令的偏移量(displacement)
可以看到在32位的情况下,默认的操作数大小为 32位, 所以我门需要添加 66前缀,改变操作数的大小
E8 cd
cd 表示后跟4字节
rel32 :指在与指令同一代码段内的相对(relative )地址偏移
Description:它的目标地址是相对于下一条指令的偏移量(displacement)
在相对寻址中,可以上下寻址, 相对偏移可以是正数,往下跳,如果是负数,往上跳
下面的例子中,FFFF FFFA 表示十进制的 -6 ,也就是相对 77261B78 偏移-6 的地址就是77261B72
9A cp
cp:在操作码后跟随的值的字节大小为6字节
ptr16:32:冒号左边的值是一个16位选择子或用于代码段寄存器的值。右侧的值对应目标段内的偏移量。
Description: 远跳转 ,绝对( absolute,),地址在操作数中给出
请留意这个汇编代码的编写格式 call far 0x0023:0x77261B72
在32位 保护模式中,段的base都是从0开始,所以目标段内的偏移量是0x77261B72
在opcode 的后6个字节中,72 1B 26 77 23 00 ,是按照小端序排列的
不知道你注意到没有, 在执行这个远跳转时, 除了返回的rip ,还有一个参数被压入栈中 ---23
如果我执行 77261B72 这个地址的ret指令,你猜会发生什么事情.
堆栈将无法平衡!!!!!!!!!!!!!!!!!!!!!!!!!!
并且,23 到底是什么东西
请翻阅 英特尔手册 第一卷的 6.4.2 Far CALL 和 RET 操作 将会找到答案
FF /2
/2 | 表示mod/rm字段 中 reg字段==2 |
r/m32 | 表示一个32位通用寄存器或内存操作数,用于指令的操作数大小属性为32位的情况。32位通用寄存器包括 EAX、ECX、EDX、EBX、ESP、EBP、ESI、EDI。在64位模式下,通过使用 REX.R 前缀,还可以访问 R8D 到 R15D 这些32位寄存器。 |
M | 表示 在 Instruction Operand Encoding 表 的M列中, Operand 1 在 ModRM字段的:r/m 字段中,并且将被读取(r) |
Description: | 近跳转,绝对 ,间接, 地址在r/m32中给出 |
翻阅 写文章-CSDN创作中心关于opcode从零开始的补充2-CSDN博客 写文章-CSDN创作中心 中 2.1.3 ModR/M and SIB Bytes章节
中的表 Table 2-2. 32-Bit Addressing Forms with the ModR/M Byte
我通过表,构造了如下的 指令 ,注意我没有通过汇编代码生成,都是使用 二进制代码编写
所以请你注意汇编指令的书写方式
请你注意 绝对的 和 间接的绝对的 跳转 的跳转两种方式的不同
FF/3
/3 | 表示mod/rm字段 中 reg字段==3 |
m16:32 | 表示包含一个由两个数字组成的远指针的 内存操作数。冒号左边的数字表示段选择符,右边的数字表示段内偏移量。 |
M | 和上面的意义相同 |
Description | 在64位模式下,RIP(指令指针寄存器)的更新规则如下 如果选择子(selector)指向一个门(gate):此时,RIP 的值将被设置为从该门中获取的64位位移(displacement)。 如果选择子没有指向门,则 RIP 将被设置为从指令中引用的远指针(far pointer)中获取的32位偏移(offset),并进行零扩展(zero extended)到64位。 |
在构建 m16:32 时, 你需要在内存地址中构建一个 6字节的数,
这个数和使用绝对寻址的形式需要一样
并将地址放入eax寄存器中
下面的代码帮助你记忆char buff[6];*(DWORD*)&buff[0] = 0x77261b72; //段内偏移*(WORD*)&buff[4] = 0x23; //段选择子 __asm{call fword ptr[buff];}
可以看到,我们没有 跨特权级,在调用call之后 堆栈中
esp==>返回地址
esp==>原来的cs段选择子
下一篇描述 jump指令
如有问题,请联系qq1490900437
相关文章:

通过call指令来学习指令摘要表的细节
E8 cw cw 表示E8后面跟随2 字节 (什么数不知道) rel16 指在与指令同一代码段内的相对地址偏移 D ,指向Instruction Operand Encoding 表中的D列, 他告诉我们 操作数1 是一个0FFSET N.S. 在64位模式下,某些指令需要使用“地址覆盖前缀”(address over…...

10分钟使用Strapi(无头CMS)生成基于Node.js的API接口,告别繁琐开发,保姆级教程,持续更新中。
一、什么是Strapi? Strapi 是一个开源的无头(headless) CMS,开发者可以自由选择他们喜欢的开发工具和框架,内容编辑人员使用自有的应用程序来管理和分发他们的内容。得益于插件系统,Strapi 是一个灵活的 C…...
创建插件 DLL 项目
Step 1: 创建插件 DLL 项目 在 Visual Studio 中创建一个新的 DLL 项目,并添加以下文件和代码。 头文件:CShapeBase.h cpp 复制代码 #pragma once #include <afxwin.h> // MFC 必需头文件 #include <string> #include <vector> #i…...

OpenCV双目相机外参标定C++
基于OpenCV库实现双目测量系统外参标定过程。通过分析双目测量系统左右相机拍摄的棋盘格标定板图像,包括角点检测、立体标定、立体校正和畸变校正的步骤,获取左右相机的相对位置关系和姿态。 a.检测每张图像中的棋盘格角点,并进行亚像素级精…...

【GESP】C++一级练习BCQM3055,4位数间隔输出
一级知识点取余、整除运算和格式化输出知识点应用。其实也可以用string去处理,那就属于GESP三级的知识点范畴了,孩子暂未涉及。 题目题解详见:https://www.coderli.com/gesp-1-bcqm3055/ https://www.coderli.com/gesp-1-bcqm3055/https://w…...

纯血鸿蒙的最难时刻才开始
关注卢松松,会经常给你分享一些我的经验和观点。 纯血鸿蒙(HarmonyOS NEXT)也正式发布了,绝对是一个历史性时刻,但最难的鸿蒙第二个阶段,也就是生态圈的建设,才刚刚开始。 目前,我劝你现在不要升级到鸿蒙…...
记一个mysql的坑
数据库表user, 存在一个name字段,字段为varchar类型 现在user表有这么两条记录: idnameageclass1NULL18一班2lisi20二班 假如我根据下面这一条件去更新,更新成功数据行显示为0 update user set age 19 where age 18 and class “一班”…...
Java中的设计模式:单例模式详解
摘要 单例模式(Singleton Pattern)是Java中最常用的设计模式之一,属于创建型模式。它的主要目的是确保一个类在系统中只有一个实例,并提供一个全局访问点来访问该实例。 1. 单例模式的定义 单例模式确保一个类只有一个实例&…...

NanoTrack原理与转tensorrt推理
文章目录 前言一、NanoTrack 工作原理二、运行demo与转换tensorrt模型2.1 运行pt模型demo2.2 转onnx模型2.3 转tensorrt模型2.4 运行trt模型推理 三、推理速度对比总结 前言 NanoTrack 是一种轻量级且高效的目标跟踪算法,基于Siamese网络架构,旨在在资源…...

YOLO11改进 | 卷积模块 | 卷积模块替换为选择性内核SKConv【附完整代码一键运行】
秋招面试专栏推荐 :深度学习算法工程师面试问题总结【百面算法工程师】——点击即可跳转 💡💡💡本专栏所有程序均经过测试,可成功执行💡💡💡 本文给大家带来的教程是将YOLO11的卷积替…...

CentOS进入单用户模式进行密码重置
一、单用户模式介绍 单用户模式是一种特殊的启动模式,主要用于系统维护和故障排除。在单用户模式下,系统以最小化的状态启动,只有最基本的系统服务会被加载,通常只有root用户可以登录。这种模式提供了对系统的完全控制࿰…...
bitpoke- mysql-operator cluster
sidecar版本只支持到8.0.35,35可以支持到mysql8.0.35 . 默认镜像是5.7的。需要自己打sidecar的镜像: # Docker image for sidecar containers # https://github.com/bitpoke/mysql-operator/tree/master/images/mysql-operator-sidecar-8.0 # 参考5…...
第5课 基本数据类型
一、数据类型的诞生 在Python的世界里,万物皆对象,每个对象都有自己的若干属性,每一个属性都能描述对象的某一个方面。就像我们每个人,都有自己的身高、年龄、姓名、性别等很多方面的信息,这里的身高、年龄、姓名、性…...

OceanBase 首席科学家阳振坤:大模型时代的数据库思考
2024年 OceanBase 年度大会 即将于10月23日,在北京举行。 欢迎到现场了解更多“SQL AI ” 的探讨与分享! 近期,2024年金融业数据库技术大会在北京圆满举行,聚焦“大模型时代下数据库的创新发展”议题,汇聚了国内外众多…...
国内知名的几个镜像源
在国内,有许多常用的Python库镜像源可以帮助加速库的下载。以下是几个知名的镜像源: 1. 清华大学TUNA协会 网址: https://pypi.tuna.tsinghua.edu.cn/simple命令示例:pip install numpy --index-url https://pypi.tuna.tsinghua.edu.cn/simple2. 阿里云…...

海外著名新闻门户媒体软文发稿之华盛顿独立报-大舍传媒
在当今全球化的时代,信息传播的速度和范围达到了前所未有的程度。对于企业和个人而言,如何在国际舞台上有效地展示自己、传递信息,成为了一项至关重要的任务。而海外媒体发稿,特别是通过像华盛顿独立报这样的知名新闻门户…...
青少年编程与数学 02-002 Sql Server 数据库应用 13课题、函数的编写
青少年编程与数学 02-002 Sql Server 数据库应用 13课题、函数的编写 课题摘要:一、函数内置函数用户定义的函数 (User-Defined Functions, UDFs)使用示例主要特点 二、内置函数数学函数(Mathematical Functions)字符串函数(String Functions…...

关于LaTeX的floatrow包导入后标题无法直接放到浮动体上方
排版一个文章,标题怎么弄都弄不到表格上方,经过阅读帮助文档才发现问题。又是一个坑。 标题位置控制 使用floatrow包之后,类似 \begin{table}[htbp]\caption{xxx。}\label{table1}\centering\begin{tabular}{lcccc}\toprule& \multicol…...

Flutter Image和Text图文组件实战案例
In this section, we’ll go through the process of building a user interface that showcases a product using the Text and Image widgets. We’ll follow Flutter’s best practices to ensure a clean and effective UI structure. 在本节中,我们将使用“Te…...
使用 xlrd 和 xlwt 库进行 Excel 文件操作
使用 xlrd 和 xlwt 库进行 Excel 文件操作 在数据分析和处理的过程中,Excel 文件是最常用的数据存储格式之一。Python 提供了多种库来处理 Excel 文件,其中 xlrd 和 xlwt 是两个经典的库,分别用于读取和写入 Excel 文件。本文将详细介绍如何使用这两个库进行 Excel 文件的操…...

eNSP-Cloud(实现本地电脑与eNSP内设备之间通信)
说明: 想象一下,你正在用eNSP搭建一个虚拟的网络世界,里面有虚拟的路由器、交换机、电脑(PC)等等。这些设备都在你的电脑里面“运行”,它们之间可以互相通信,就像一个封闭的小王国。 但是&#…...

测试微信模版消息推送
进入“开发接口管理”--“公众平台测试账号”,无需申请公众账号、可在测试账号中体验并测试微信公众平台所有高级接口。 获取access_token: 自定义模版消息: 关注测试号:扫二维码关注测试号。 发送模版消息: import requests da…...

渗透实战PortSwigger靶场-XSS Lab 14:大多数标签和属性被阻止
<script>标签被拦截 我们需要把全部可用的 tag 和 event 进行暴力破解 XSS cheat sheet: https://portswigger.net/web-security/cross-site-scripting/cheat-sheet 通过爆破发现body可以用 再把全部 events 放进去爆破 这些 event 全部可用 <body onres…...

基于Docker Compose部署Java微服务项目
一. 创建根项目 根项目(父项目)主要用于依赖管理 一些需要注意的点: 打包方式需要为 pom<modules>里需要注册子模块不要引入maven的打包插件,否则打包时会出问题 <?xml version"1.0" encoding"UTF-8…...
Rust 异步编程
Rust 异步编程 引言 Rust 是一种系统编程语言,以其高性能、安全性以及零成本抽象而著称。在多核处理器成为主流的今天,异步编程成为了一种提高应用性能、优化资源利用的有效手段。本文将深入探讨 Rust 异步编程的核心概念、常用库以及最佳实践。 异步编程基础 什么是异步…...

让AI看见世界:MCP协议与服务器的工作原理
让AI看见世界:MCP协议与服务器的工作原理 MCP(Model Context Protocol)是一种创新的通信协议,旨在让大型语言模型能够安全、高效地与外部资源进行交互。在AI技术快速发展的今天,MCP正成为连接AI与现实世界的重要桥梁。…...
大语言模型(LLM)中的KV缓存压缩与动态稀疏注意力机制设计
随着大语言模型(LLM)参数规模的增长,推理阶段的内存占用和计算复杂度成为核心挑战。传统注意力机制的计算复杂度随序列长度呈二次方增长,而KV缓存的内存消耗可能高达数十GB(例如Llama2-7B处理100K token时需50GB内存&a…...

基于Springboot+Vue的办公管理系统
角色: 管理员、员工 技术: 后端: SpringBoot, Vue2, MySQL, Mybatis-Plus 前端: Vue2, Element-UI, Axios, Echarts, Vue-Router 核心功能: 该办公管理系统是一个综合性的企业内部管理平台,旨在提升企业运营效率和员工管理水…...

Linux nano命令的基本使用
参考资料 GNU nanoを使いこなすnano基础 目录 一. 简介二. 文件打开2.1 普通方式打开文件2.2 只读方式打开文件 三. 文件查看3.1 打开文件时,显示行号3.2 翻页查看 四. 文件编辑4.1 Ctrl K 复制 和 Ctrl U 粘贴4.2 Alt/Esc U 撤回 五. 文件保存与退出5.1 Ctrl …...

云安全与网络安全:核心区别与协同作用解析
在数字化转型的浪潮中,云安全与网络安全作为信息安全的两大支柱,常被混淆但本质不同。本文将从概念、责任分工、技术手段、威胁类型等维度深入解析两者的差异,并探讨它们的协同作用。 一、核心区别 定义与范围 网络安全:聚焦于保…...