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

CTF权威指南 笔记 -第三章汇编基础-3.2-x86/x64汇编基础

这节介绍PC最常见的架构 x86和扩展 x64框架

CPU操作模式

对x86处理器而言 有三个最主要的保护模式

保护模式
实地址模式
系统管理模式

还有一个保护模式的子模式

虚拟8086模式

保护模式

保护模式是处理原生状态 这个时候所有指令和特性都是可以使用的 
分配给程序的独立内存区域 叫做内存段
处理器阻止程序使用自身段以外的内存区域
同时 寄存器扩展到32位 解决内存寻址空间的问题并且各个指令区分特权等级 危险的只有较高权限才能执行
增加CPU对内存地址的访问的权限控制

实地址模式

是早起intel的编程环境 该模式程序可以直接访问硬件和其实际地址
没有经过虚拟地址的映射
方便了程序开发 没有权限的说法
程序发往内存是直接读写 没有审核
CPU可以执行任何程序 内存之间没有隔离保护

系统管理模式

为操作系统提供电源管理 安全保护等特性机制

对于x86_64的处理器

还有一个操作模式

IA_32E

这个模式包含着两个子模式

兼容模式:
现有的32位和16位不需要重新编译64位模式:
处理器将在64位的地址空间下运行程序

语法风格

x86 有两个语法风格

AT&T风格和Intel风格

gcc gdb objdump都默认使用AT&T风格

 这里我们关注一下

间接寻址的格式

AT&A
%sreg:disp(%base,index,scale)%sreg:是段寄存器 用于制定段地址cs:disp是偏移量 是相对于基地址的偏移 可以是在程序计算出来的值cs:4%base是基地址寄存器 存储内存块的开始 cs:4(%eax,)index为变址寄存器 表示偏移地址的计算cs:4(%eax,%ebx)scale为比例因子 可以为 1,2,4,8等 表示 index*scale作为偏移地址cs:4(%eax,%ebx,2)mov %ecx,4(%eax,%ebx,2)
表示 从ecx的地方读取 存入 eax+2*ebx+4的地址去 intel就很简单
mov [esi+eax*4+0x10], ebx这里就可以发现ebx存入 esi+eax*4-0x10的地址去

操作位数

AT&T
指令+l/w/b是什么意思呢
我们先知道l/w/b代表什么
l为32位整数双字
w为16位整数单词
b为8位整数字节
举例addl $0x12345678,%ebx
把双字数据0x12345678存入ebx中 并且大小为32位
但是实际操作数为 33位
addw $0x1234, %ah
把字数据0x1234存入 ah中 大小为16位
实际操作数为17位addb 0x11,%al
把字节数据 0x11存入al中 大小为8位
实际操作数为9位
不加的话默认64位Intel
qword ptr 为64位操作数dword ptr 为32位操作数

寄存器和数据类型

寄存器

从8位处理器到16位 再到32和64位 寄存器名字也不一样

 在 64位模式下 操作数大小还是32位 如果我们需要把他变为64位 只需要赋值给64位的寄存器

mov rax, eax

并且还增加了 8个带符号的通用寄存器(R8~R15)

数据常量

对于整数常量 1234 可以是10进制 16进制 或者8进制 所以需要后缀进行区分

如果16进制中包含了字母 为了防止 汇编器把他当汇编指令或标识符

需要再字母开头的十六进制中+0

例如 0ABCh

浮点数常量

也叫做实数常量

x86有单独的浮点数寄存器和浮点数指令 对浮点数进行操作

我们通常以10进制表示浮点数

16进制表示编码浮点数

一个浮点数应该包含一个十进制整数和一个十进制小数点1. 
+2.3
-3.1415
26.E5
都是合法的

字符串常量

字符串常量是用 ''/ ""括起来的字符序列(包含空格符)

"hello world",'he says "hello"',"he's a funny man" 这是合法的 字符串嵌套

 

 字符串处理在内存中是以整数字节序列保存的

字符串"ABCDEFGH'’在gdb中的显示样子为

 

这个是以16进制打印 

 这里能发现是小端序 这个我们后面再学

数据传送与访问

MOV

MOV是指令是最基本的数据传输指令 几乎所有程序都在使用

可以在一个程序中只使用mov就可以完成 证明了 图灵完备

MOV指令的基本格式 第一个参数为目的操作数 第二个参数为源操作数MOV EAC,ECX 就是把ECX的值拷贝到EAX中MOV 支持从寄存器到寄存器 
从内存到寄存器
从寄存器到内存
从立即数到内存
从立即数到寄存器的数据传输但是!!!不支持内存到内存的传输想要实现这个 就需要一个寄存器作为中转
MOV EAX,0        EAX= 00000000h
MOV AL,78h       AL = 00000078h
MOV AX,1234h     AX = 00001234h
MOV EAX,12345678h  EAX=12345678h

如果我们要把操作数扩展到大的操作数的话 我们需要通过全零扩展和符号扩展

全零扩展和符号扩展

我们使用例子来说明全零扩展和符号扩展

unsigned char x = 0xC1; // 11000001全零扩展  直接把c1存到底8位 剩下24位通过 0 填充x = 0x000000c1符号扩展 因为0xc1 为 11000001 最高位为1(符号位)所以通过1复制到高24位x=0xffffffc1

XGHG

数据访问内存指令还有 XCHG 允许我们交换两个操作数的值

可以是寄存器到寄存器

内存到寄存器

或者寄存器到内存

数组

在x86中 使用变量名和偏移量来代表一个 直接偏移量操作数

.data testarray BYTE 99h, 98h, 97h, 96h
.codeMOV AL,testarray        al=99hMOV BL,[testarray+1]    bl=98hMOV CL,[testarray+2]    cl=97h

双字数组的汇编代码段 需要使用符合数组元素的偏移量才可以正确表示数组元素的位置

就是需要准确的偏移量

.data testarrayW WORD 99h, 98h, 97htestarrayD DWORD 1000h,2000h,3000h
.codeMOV AX,testarrayW        AX=99hMOV BX,[testarrayW+2]    BX=98hMOV ECX,testarrayD        ECX=1000hMOV EDX,[testarrayD+4]    EDX=2000h

算数运算和逻辑运算

最简单的算数运算指令 INC和DEC 分别用于操作数+1 操作数-1

这两个指令的操作数既可以是寄存器 也可以是内存

.data testWord WORD 1000h
.codeINC EAXDEC testWord

补码

计算机底层数据是以补码表示的

两个机器数相加的补码相加可以先对两个机器数补码 然后相加

在采用补码形式表示时

进行加法运算 就可以把符号位和数值位一起进行运算 符号位有进位直接舍弃

结果之和为两个数的补码之和

ADD

长度相同的操作数进行相加

.datatestData Dword 10000htestData2 Dword 20000h
.codeMOV EAX, testData       EAX=10000hADD EAX, testData2      EAX=30000h

SUB

从目的操作数中减去源操作数

.datatestData DWORD 20000htestData2 DWORD 10000h
.codeMOV EAX, testData     eax=20000hSUB EAX, testData2    eax=10000h

NEG

NGS是把操作数转化为二进制补码 并且把操作数的符号位取反

跳转指令和循环指令

CPU是顺序加载并且执行程序的

但是 指令集中会存在 条件型指令

将根据CPU的标志位寄存器决定程序控制流的走向

在x86中 每一个条件指令都暗含着跳转指令

跳转指令分成
有条件跳转 和 无条件跳转

JMP

为无条件跳转

    JMP labe11MOV EBX, 0 
labe11:MOV EAX, 0 

LOOP

loop创建 循环代码块

ECX寄存器为循环的计数器

CX是 loop指令和loopw指令的默认循环计数器
ECX寄存器是loopd指令的循环计数器
64位的x86 loop指令使用RCX为默认循环计数器

经过一次循环

ECX将-1

MOV AX, 0 
MOV ECX, 3
L1:
INC AX
LOOP L1
XOR EAX,EBX

循环一次 ECX-1 并且和0进行判断

如果ECX=0 就不进行跳转 执行 XOR EAX,EBX

如果ECX!=0 就进行跳转 重新执行 L1

注意

如果在loop开始前 EAX设置为0 
-1 就会跳转到 FFFFFFFFh
非常大的循环

栈和函数的调用

CALL

 相当于PUSH 返回地址   JMP 函数地址的指令序列

RET

相当于POP 返回地址 JMP 返回地址的指令序列

如果要存储变量的话

这些部分我以前写过

直接给出

1.栈的介绍-C语言调用函数(一)_双层小牛堡的博客-CSDN博客

1.栈的介绍-C语言调用函数(二)_双层小牛堡的博客-CSDN博客

相关文章:

CTF权威指南 笔记 -第三章汇编基础-3.2-x86/x64汇编基础

这节介绍PC最常见的架构 x86和扩展 x64框架 CPU操作模式 对x86处理器而言 有三个最主要的保护模式 保护模式 实地址模式 系统管理模式还有一个保护模式的子模式 虚拟8086模式 保护模式 保护模式是处理原生状态 这个时候所有指令和特性都是可以使用的 分配给程序的独立内…...

争夺汽车芯片「高地」

一直以来,汽车芯片无论是工艺制程,还是新技术的导入,都要落后消费类产品几年时间。不过,如今,随着汽车智能化进一步推动汽车制造商与上游芯片设计公司、晶圆代工厂的紧密互动,历史即将翻篇。 同时&#xf…...

SuperMap GIS基础产品三维GIS FAQ集锦(2)

SuperMap GIS基础产品三维GIS FAQ集锦(2) 【WebGL】桌面对三维缓存设置了最大最小可见高度,在iServer发布三维服务并进行预览是可以看到该效果的,但在前端代码打开该服务,最大最小可见高度效果丢失,请问怎…...

11.streamFile

1.Stream流 1.1体验Stream流【理解】 案例需求 按照下面的要求完成集合的创建和遍历 创建一个集合,存储多个字符串元素把集合中所有以"张"开头的元素存储到一个新的集合把"张"开头的集合中的长度为3的元素存储到一个新的集合遍历上一步得到的集…...

如何裁剪图片大小尺寸?

如何裁剪图片大小尺寸?平时我们在工作或者学习的时候,会经常需要将图片上传到不同的网站或者平台上,然而上传的时候经常会受到尺寸的限制,有时候尺寸太大就需要变小,为了确保上传成功,我们需要将图片进行裁…...

深度学习笔记之梯度下降、反向传播与内置优化器

文章目录 1. 梯度下降法2. 反向传播算法3. PyTorch内置的优化器3.1 SGD优化器3.2 RMSprop优化器3.3 Adam优化器 1. 梯度下降法 笔者往期的机器学习笔记: 机器学习之梯度下降算法 梯度下降法是一种致力于找到函数极值点的算法。 所谓“训练”或“学习”就是改进…...

Visual Studio 2022 搭建GLFW OpenGL开发环境

最近工作需要 需要写一个全景的视频播放器 网上搜了下大概解决方案是 ffmpegopengl b站有很多视频 按照视频 搭建了OpenGL的开发环境 先去GLFW的网站下载 windows平台的库文件 为什么使用GLFW 因为GLFW是跨平台的 我下的是64位版本解压后有目录如下 包含了动态库和静态…...

四元数快速入门【Quaternion】

四元数(Quaternion)是用于旋转和拉伸向量的数学运算符。 本文提供了一个概述,以帮助理解在空间导航等应用程序中对四元数的需求。 推荐:用 NSDT场景设计器 快速搭建3D场景。 可以通过多种方式在空间中准确定位、移动和旋转物体。 …...

为什么我们要使用向量化运算

问题背景 如果你是matlab用户,你一般都会使用向量化运算进行编程。原因也许很简单,因为matlab针对向量化运算在底层做了深度优化,尤其是针对矩阵乘法调用了MKL之类的高度优化的第三库来加速。所以我们在推演算法的阶段,尽量的以向…...

Makefile零基础教学(一)初识makefile

从这篇文章开始就开始进入 Makefile 的零基础教程,相信只要看了本教程的都可以对 Makefile 有一个清晰的理解和正确的运用。那么现在就开始我们的 Makefile 学习之路。 文章目录 一、什么是 Makefile,优点?二、什么是 make, 为什么使用make?…...

如何使用SpringMVC之常用注解

❣️关注专栏:JavaEE Spring MVC ⌛️ 1. Spring MVC 创建和连接⌛️ 1.1 RequestMapping⌛️ 1.2 GetMapping⌛️ 1.3 PostMapping ⌛️ 2. 获取参数⌛️ 2.1 传递/获取单个参数⌛️ 2.2 传递/获取多个参数⌛️ 2.3 传递/获取对象⌛️ 2.4 参数重命名⌛️ 2.4.1 …...

Vue3的axios请求封装,请求拦截,相应拦截

对于三者放在Service.js中封装,方便使用 axios.create 的作用是创建一个新的 axios 实例,该实例可以具有自定义配置。通过使用 axios.create,您可以为任何 API 生成一个客户端,并在使用同一客户端的任何调用中重复使用相同的配置…...

ZC706P试验PL_DDR3内存条的步骤方法

ZC706P 板卡完全兼容XILINX官方的ZC706,当然也支持PL外挂的1G的DDR3内存条,这个片BLOG我提供从官方下载的一个文档和一个项目,演示一下验证DDR3的步骤。 步骤1:准备好板子,安装好软件。 链接:https://pan.baidu.com/s…...

通达信W底形态选股公式,也称双底形态

W底形态,也称双底形态,是一种经典的技术分析形态,代表了跌势的逆转。看起来像字母 "W",描述了一波下跌,反弹,再次下跌到与上一波下跌相同或相近的位置,最后是另一波反弹。W底形态两次…...

java语言与算法、数据结构的用法

Java语言是一种广泛使用的计算机编程语言,也是开发各种软件和操作系统的重要工具之一。除了具有高效性和可移植性之外,Java语言还具有丰富的算法和数据结构支持,可以帮助程序员轻松地解决各种问题。 算法和数据结构是计算机科学中的两个基本…...

中国社科院与美国杜兰大学金融管理硕士项目,引领你走在金融行业前沿

作为金融领域从业人员时刻都在关注行业最新资讯,只有掌握一手的前沿讯息,才能在职场上无往不胜。针对在职的你,如何利用业余时间让自己更增值呢,中国社科院与美国杜兰大学金融管理硕士项目引领你走在金融行业前沿。 金融管理硕士…...

第三十五章 Unity人形动画(下)

本章内容主要就是动画数据的独立文件使用方式。有了独立的动画文件,我们就可以将其应用到其他模型上面了。最简单的方式就是,我们可以给其他模型编辑动画控制器的时候,使用这些动画文件。Unity则给我们提供了更加高级的共享方式,就…...

vue导入导出excel、设置单元格背景色、文字居中、合并单元格、设置列宽(使用xlsx库和xlsx-style库)

xlsx xlsx是由SheetJS开发的一个处理excel文件的npm库 适用于前端开发者实现导入导出excel文件的经典需求 为了区别于xlsx文件,突出其应用语言,该库通常又被称为js-xlsx 导出js数据为Excel文件 需要以下步骤: 安装 xlsx 库 你可以使用 …...

java 线程池

线程池 是 一个 容器,其中管理着多个线程(预先创建并维护一定数量的线程),当有一个任务a需要一个线程去完成时,从容器(线程池)中获取一个线程A去执行任务a,当线程A完成任务a后,线程A…...

音频焦点使用及原理

音频焦点使用及原理 本博客代码基于Android 10源码 为什么会有音频焦点这一概念? 在Android音频领域中,应用层所有的App播放音频,最终都是走到音频回播线程PlaybackThread中,如果多个App都走到同一个PlaybackThread中去&#xff0…...

PyQt5桌面应用开发(8):从QInputDialog转进到函数参数传递

本文目录 PyQt5桌面应用系列How old are you, Dialog?QInputDialog minimalistwhy not lambdaand how partial worksSummary PyQt5桌面应用系列 PyQt5桌面应用开发(1):需求分析 PyQt5桌面应用开发(2):事件…...

2.0 Vue框架设计的核心要素

本章主要讲解,一个好的框架在构建的时候,需要考虑到的要素,包含报错信息反馈、警告信息反馈、减少打包体积、良好的输出、特性开关(兼容)等 1、提升用户开发体验 提升用户开发体验主要体现在用户使用框架进行开发时&…...

“智慧赋能 强链塑链”——精细化工行业仓储物流数字化转型探讨

精细化工行业作为衡量国家化学工业水平高低的重要标志,为国民经济提供重要的终端产品支持,相比较大化工产品,精细化工产品需要高度专业技能和工艺,其生产过程需要复杂的化学反应,以及严格的控制条件,产出的…...

用DG备库做的rman备份恢复一个数据库

环境描述: 1.因为主库存储空间不足,于是将备份放在dg备库上做。 2.主库因为磁盘空间问题,数据文件有两个目录。 3.dg备库因为主库两个数据文件目录里面有两个同名数据文件,所有dg备库也有两个数据文件目录。 4.主库与备库与测…...

JAVA中的IO操作有哪些?

在Java编程语言中,输入/输出(IO)操作是很重要的部分,它允许程序从外部系统读取数据,或将数据输出到外部系统。Java提供了一组强大的IO类库,可以让开发人员方便地进行各种IO操作。 Java中的IO操作可以分为两…...

10:00面试,10:04就出来了 ,问的实在是太...

从外包出来,没想到竟然死在了另一家厂子 自从加入这家公司,每天都在加班,钱倒是给的不少,所以我也就忍了。没想到12月一纸通知,所有人都不许加班,薪资直降30%,顿时有吃不起饭的赶脚。 好在有个…...

wangzherongyao PMO

感谢【五一节】大家的相遇,总结下。 2023年05月02日,【第一组】组队开黑 我总结了下这天为什么打的那么好,首先赛季初段位在王者附近,大家心态重视程度也高,不轻敌,也不盲目,运营好兵线一步一步…...

Dart语法上

一、Dart介绍及环境 1.1 Dart介绍: Dart是由谷歌开发的计算机编程语言,它可以被用于web、服务器、移动应用 和物联网等领域的开发。Dart诞生于2011年,号称要取代JavaScript。但是过去的几年中一直不温不火。直到Flutter的出现现在被人们重新重视。 要学…...

SignOff Criteria——POCV(Parametric OCV) introduction

文章目录 1. O v e r v i e w Overview Overview2. P O C V A n a l y s i s POCV\ Analysis POCV Analysis3. P O C V F l o w POCV\ Flow POCV Flow4. P O C V R e p o r t POCV\ Report POCV Report 1. O v e r v i e w Overview Overview P r o c e s s v a r i a t i…...

Android 内存分析(java/native heap内存、虚拟内存、处理器内存 )

1.jvm 堆内存(dalvik 堆内存) 不同手机中app进程的 jvm 堆内存是不同的,因厂商在出厂设备时会自定义设置其峰值。比如,在Android Studio 创建模拟器时,会设置jvm heap 默认384m , 如下图所示: 当app 进程中java 层 new 对象(加起来总和)占用…...