x64汇编语言与逆向工程基础指南(三)

简介: x64汇编语言与逆向工程基础指南(三)

1. xchg交换指令

  • xchg(Exchange):交换两个操作数的值。这个指令将两个操作数的值互换。
  • 例如,xchg ax, bx 将寄存器 ax 和 bx 的值互换。

1.1 xchg reg , reg

以 xchg rax , rbx 为例


  • 选中寄存器窗口某个具体寄存器,右键可以直接进行编辑内容。

  • 初始rax,rbx寄存器内容如下图:


  • 执行 xchg rax , rbx 结果


1.2 xchg mem , reg

xchg mem , rax


Tips:x64gdb奇奇怪怪的,直接用下面的指令覆盖原来的汇编代码,会出现 invalidAddress64Bit 保错导致无法写入汇编代码,猜测写入.bss段地址有问题,但是选择的地址明明有写入权限。

最后使用IDA修改一部分代码之后再次使用x64dbg修改才成功 ,绕了一大圈┭┮﹏┭┮。

  • 执行前


  • 结果

1.3 间接实现 xchg mem , mem

由于无法直接交换两个内存地址的数据,因此需要使用寄存器作为中转。

mov reg , mem_1
xchg reg , mem_2
mov mem_1 , reg
  • 初始数据

  • 执行结果

2. inc , dec指令

  • inc(Increment):将操作数的值增加1。例如,inc ax 会将寄存器 ax 的值增加1。
  • dec(Decrement):将操作数的值减少1。例如,dec bx 会将寄存器 bx 的值减少1。


2.1 inc/dec reg

inc / dec rax


2.2 inc/dec mem

3. neg取反指令

  • neg(Negate):将操作数的值取反,即将其变为相反数。例如,neg cx 会将寄存器 cx 的值变为其相反数(如果 cx 的原值是 5,那么 neg cx 后 cx 的值会变成 -5)。

当你执行 neg rax 并且 rax 初始值为 1 时,结果为全 F 的原因是 neg 指令执行了取反操作,具体解释如下:

3.0 neg 指令原理

  • 作用neg 指令用于将寄存器中的值取反,即计算其相反数。计算过程是通过取反操作和加一来实现的。
  • 计算过程

1.初始值:


假设 rax 初始值为 1。在 64 位补码表示中,1 的二进制表示为:

0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0001

2.取反:


取反操作将所有位反转,即 1 变为 0,0 变为 1。所以,1 的取反值是:

1111 1111 1111 1111 1111 1111 1111 1111 1111 1111 1111 1111 1111 1111 1111 1110

这是 -2 的补码表示。

3.加一:

将取反后的值加 1

1111 1111 1111 1111 1111 1111 1111 1111 1111 1111 1111 1111 1111 1111 1111 1111

这个值是 -1 的补码表示。对于无符号 64 位整数,-1 表示为全 F 的值,即:

FFFFFFFFFFFFFFFF

结果解释


取反操作:对于 1,取反得到 -2,加 1 得到 -1。在补码表示中,-1 的二进制表示是全 F,即 FFFFFFFFFFFFFFFF。


补码表示:在计算机中,负数通常用补码表示。补码的特性是,-1 的补码表示是所有位都是 1。


因此,当 rax 的初始值为 1 时,执行 neg rax 后,rax 变为 -1,即在 64 位中,全 F 的值 FFFFFFFFFFFFFFFF。

3.1 neg reg

neg rax

3.2 neg mem



4. sub/add指令

  • add(Add):将两个操作数的值相加,并将结果存储在目标操作数中
  • 例如,add ax, bx 会将寄存器 bx 的值加到寄存器 ax 中,并将结果存储在 ax 中。
  • sub(Subtract):将第二个操作数的值从第一个操作数中减去,并将结果存储在第一个操作数中
  • 例如,sub ax, bx 会将寄存器 bx 的值从寄存器 ax 中减去,并将结果存储在 ax 中。


4.1 sub/add reg , imm

sub / add rax , 0x1


4.2 sub/add mem , imm


4.3 sub/add reg , reg

sub / add rax , rbx


4.4 sub/add 作用 reg 与 mem


sub / add rax , mem 执行结果

sub / add mem , rbx执行结果



5.标志寄存器

  • 零标志位(ZF, Zero Flag)
  • 作用:当运算结果为零时,ZF 标志被置为 1;如果结果非零,ZF 被清除(设为 0)。
  • 用途:ZF 主要用于条件跳转指令中,如 je(Jump if Equal)或 jne(Jump if Not Equal),以根据运算结果是否为零来决定程序的跳转。
  • 溢出标志位(OF, Overflow Flag):


  • 作用:当算术运算的结果超出了目标寄存器或操作数的表示范围时,OF 标志被置为 1;否则,OF 被清除(设为 0)。对于有符号数的加法或减法,如果结果无法用所用位数表示,则会发生溢出。
  • 用途:OF 主要用于有符号数的算术运算中,帮助检测结果是否超出可表示的范围。对于有符号数的运算,OF 是重要的判断依据。
  • 符号标志位(SF, Sign Flag):


  • 作用:SF 标志反映运算结果的符号。对于有符号数的运算,SF 被设置为结果的最高有效位(即最左边的位)的值。如果结果为负数,SF 被置为 1;如果结果为非负数,SF 被清除(设为 0)。
  • 用途:SF 用于有符号数的条件判断中,帮助判断运算结果的符号。
  • 例如,条件跳转指令 js(Jump if Sign)可以根据 SF 的值决定是否跳转。
目录
相关文章
|
22天前
|
存储 前端开发 rax
x64汇编语言与逆向工程基础指南(二)
x64汇编语言与逆向工程基础指南(二)
33 1
|
22天前
|
数据可视化 前端开发 rax
x64汇编语言与逆向工程实战指南(一)
x64汇编语言与逆向工程实战指南(一)
41 1
|
22天前
|
前端开发 rax 网络协议
x64汇编语言与逆向工程基础指南(一)
x64汇编语言与逆向工程基础指南(一)
60 0
|
22天前
|
存储 前端开发 rax
x64汇编语言与逆向工程基础指南(四)
x64汇编语言与逆向工程基础指南(四)
44 0
|
4月前
|
安全 NoSQL Linux
《ARM汇编与逆向工程 蓝狐卷 基础知识》
《ARM汇编与逆向工程 蓝狐卷 基础知识》
72 0
|
4月前
|
算法 小程序 Linux
如何写出高效清晰的嵌入式C程序
如何写出高效清晰的嵌入式C程序
31 0
|
4月前
|
算法 小程序 Linux
如何编写高效清晰的嵌入式C程序
如何编写高效清晰的嵌入式C程序
20 0
|
4月前
|
敏捷开发 设计模式 Unix
嵌入式C语言代码的基本编写规范要求
嵌入式C语言代码的基本编写规范要求
124 0
|
存储 安全 程序员
5.1 汇编语言:汇编语言概述
汇编语言是一种面向机器的低级语言,用于编写计算机程序。汇编语言与计算机机器语言非常接近,汇编语言程序可以使用符号、助记符等来代替机器语言的二进制码,但最终会被汇编器编译成计算机可执行的机器码。相较于高级语言(如C、Python等),汇编语言学习和使用难度相对较大,需要对计算机内部结构、指令集等有深入的了解,以及具有良好的编程习惯和调试能力。但对于需要对计算机底层进行操作的任务,汇编语言是极其高效的,因为其可以实现对计算机底层资源的精细控制,极大地提高了计算机运行效率。
89 0
|
缓存 前端开发 Java
汇编语言简介
汇编语言(assembly language)是一种用于电子计算机、微处理器、微控制器或其他可编程器件的低级语言,亦称为符号语言。在汇编语言中,用助记符(Mnemonics)代替机器指令的操作码,用地址符号(Symbol)或标号(Label)代替指令或操作数操作数的地址。在不同的设备中,汇编语言对应着不同的机器语言指令集,通过汇编过程转换成机器指令。普遍地说,特定的汇编语言和特定的机器语言指令集是一一对应的,不同平台之间不可直接移植。