x86汇编语言基础知识


x86汇编语言必备知识
x86汇编语言主要包括总线、寄存器结构,数据类型,基本的操作指令(包括数据传送指令、逻辑计算指令、算数运算指令),以及函数的调用规则。

具体内容可以查看这个博客https://www.cnblogs.com/jiftle/p/8453106.html

内存

一个程序内存主要分为以下四个节:
在这里插入图片描述
:用于函数的局部变量和参数,以及控制程序执行流。
:为程序执行期间需要的动态内存准备的,用于创建(分配)新的值以及消除(释放)不需要的值。也称动态内存。
代码:包含了执行程序任务时CPU取得的指令。决定了程序要做什么和怎么做。
数据:包含一些值,这些值在程序初始加载时被放到这里。称为动态值,因为程序运行时他们可能并不发生变化。也称全局值,因为程序任何部分都可以使用它们。

总线

  • 地址总线的宽度决定CPU的寻址能力。一个CPU有N根地址总线,最多可以寻找2N内存单元(B)
  • 数据总线的宽度决定CPU与其他器件进行数据传送时的一次数据传送量。一个CPU有N根数据总线,一次可传送一个N位二进制数据。如:数据总线的宽度为8根则可传送1B的数据。
  • 控制总线的宽度决定CPU对系统中其他器件的控制能力。有多少根控制总线,意味着CPU提供了多少种对外部器件的控制。

寄存器

寄存器是可以被CPU使用的少量数据存储器,访问其中的内容的速度会比访问其他存储器要快。分为以下四类

通用寄存器

X86处理器中有8个32位的通用寄存器。

EAX:“累加器”(accumulator), 通常用于计算,它是很多加法乘法指令的缺省寄存器 ;存放函数返回值。
ECX:计数器(counter),通常用于循环变量计数, 是重复(REP)前缀指令和LOOP指令的内定计数器。
ESP:指示栈指针(用于指示栈顶位置)
EBP:指示基址指针(用于指示子程序或函数调用的基址指针)。
EBX:基地址寄存器
EDX: 总是被用来放整数除法产生的余数
ESI/EDI:“源/目标索引寄存器”,因为在很多字符串操作指令中, DS:ESI指向源串,而ES:EDI指向目标串。

!注意EAX、EBX、ECX和EDX的前两个高位字节和后两个低位字节可以独立使用,其中两位低字节又被独立分为H和L部分,这样做的原因主要是考虑兼容16位的程序

段寄存器

用于定位内存节

CS
SS
DS
ES
FS
GS

状态标志

标志寄存器,置位值为1或者清除值为0,这些值由CPU控制

ZF:当一个运算的结果等于0时,ZF被置位,否则被清除。
CF:当一个运算的结果相对于目标操作数太大或太小时,CF被置位,否则被清除。
SF:当一个运算的结果为负数,SF被置位;若结果为正数,SF被清除。对算术运算,当运算结果的最高位值为1时,SF也会被置位。
TF:TF用于调试。当它被置位时,x86处理器每次只执行一条指令。

EIP指令指针

在x86中,EIP寄存器又称指令指针或程序计数器,保存了程序将要执行的下一条指令在内存中的地址。EIP的唯一作用就是告诉处理器接下来要做什么。

控制了EIP即控制了CPU要执行什么,所以攻击者常常通过漏洞利用获得对EIP的控制(攻击者先要使攻击代码进入内存,然后改变EIP使其指向那段代码,从而攻击系统)

数据表示

在x86/x64体系中,指令处理的数据分为fundamental(基础)和numeric(数值)两大类。

基础(fundamental)类型

byte(8位),word(16位),doubleword(32位),以及quadword(64位),它们代表指令能一次性处理的数据宽度。

数据(numeric)类型

使用在运算类指令上
1、 integer(整型数):包括unsigned类型和singed类型。
2、 floating-point(浮点数):包括single-precision floating-point(单精度浮点数),double-precision floating-point(双精度浮点数),以及double extended-precision floating-point(扩展双精度浮点数)。
3、 BCD(binary-code decmial integer):包括non-packed BCD码和packed-BCD码。
4、 SIMD(single instruction, multiple data):这是属于packed类型的数据。

!注意 SIMD数据是在一个operand(操作数)里集成了多个integer、floating-point或者BCD数据。SIMD指令可以一性次同时处理这些数据。

x86基本操作指令

!注意:在分析恶意代码时,如果遇到一个函数只有xor、or、and、shl、ror、shr、rol等这样的指令并且反复出现·看起来像随机排列的样子,最可能是遇到了加密或者压缩的函数!

shl、shr指令用于对寄存器做移位操作
ror、rol指令循环移位

指令格式

在这里插入图片描述
指令前缀
例子:
在这里插入图片描述
红框为指令前缀(冒号前),粉框为操作码

ModR/M:辅助说明操作码的操作数(操作数的个数、种类[寄存器、内存地址、常量])

SIB:辅助说明ModR/M,辅助寻址。操作码的操作数为内存地址时,需要与ModR/M一起使用

位移:操作码的操作数为内存地址(小端序排列)时,用来表示位移操作
在这里插入图片描述
立即数:操作码的操作数为常量时,该常量就被称为立即数
在这里插入图片描述

每条指令使用操作码告诉CPU程序要执行什么操作。反汇编器将操作码翻译为人类容易读懂的指令。
如:指令mov ecx,0x42的操作码是B9 42 00 00。mov ecx对应B9,0x42对应42 00 00。在这里插入图片描述
字节序
!注意网络数据使用大端字节序,x86使用小端字节序。

大端方式:最低字节存储在最高位置上
小端方式:最低字节存储在最低位置上

如:网络上IP地址为127.0.0.1是0x7f000001,在x86小端字节序则是0x0100007f
在分析代码时,必须了解字节序哟,不然会将重要数据弄反的!

操作数

操作数分为三个类型:

1.内存地址

位移:操作码的操作数为内存地址(小端序排列)时,用来表示位移操作
在这里插入图片描述

2.立即数

立即数:操作码的操作数为常量时,该常量就被称为立即数
在这里插入图片描述

3.寄存器

操作数指向寄存器

常用指令可以查看这个https://zhuanlan.zhihu.com/p/53394807

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值