为什么要写这篇教程呢?
本文章仅提供学习,切勿将其用于不法手段!
因为想要成为一名白帽黑客,汇编语言是必须要掌握的!
无论是二进制漏洞挖掘,还是逆向工程!汇编语言,都是硬性基础之一!当然,你还需要学会C语言!为什么要学会C语言呢?IDA软件 会将 二进制代码 翻译成 汇编语言 和 C语言 !
你不会汇编语言,不会C语言,想要进行逆向工程,以及更深层次的 二进制漏洞挖掘,是非常困难!如果你希望挖掘 二进制漏洞 ,你还要学会 代码审计 !
你必须看得懂,汇编语言代码 和 C语言代码,这是硬性要求!
想要参加CTF竞赛,汇编语言 和 C语言 都是重要的底层基础知识。
现在,我们来接着讲一下二进制逆向方面的知识!漏洞挖掘的一些知识,也会在这一章节中进行讲解!
想要进行逆向工程,就必须了解 RFLAGS 标志寄存器中每一位的作用!
在 X64 环境下,RFLAGS
是一个 64 位的标志寄存器,但其中只有低 32 位是实际使用的,高 32 位是保留位。这 32 位标志寄存器用于存储处理器在执行指令过程中产生的各种状态信息,这些状态信息可以影响程序的执行流程。下面我将用大白话的方式讲解一下其中一些常用的标志位的作用:
-
进位标志(Carry Flag, CF):
- 当执行加法运算时,如果结果超出了寄存器的存储范围,就会产生进位,此时 CF 会被设置为 1。
- 当执行减法运算时,如果当前位的被减数小于减数,需要向前一位借位,此时 CF 也会被设置为 1。
- 这个标志位常用于处理需要跨越多位的算术运算。
-
零标志(Zero Flag, ZF):
- 当算术或逻辑运算的结果为 0 时,ZF 会被设置为 1。
- 这个标志位常用于判断运算结果是否为 0,从而决定程序的下一步操作。
-
符号标志(Sign Flag, SF):
- 当运算结果的最高位(即符号位)为 1 时,表示结果为负数,此时 SF 会被设置为 1。
- 反之,如果最高位为 0,表示结果为正数或零,SF 为 0。
- 这个标志位常用于判断运算结果的符号。
-
溢出标志(Overflow Flag, OF):
- 当执行有符号整数运算时,如果结果超出了有符号整数的表示范围,就会产生溢出,此时 OF 会被设置为 1。
- 需要注意的是,OF 只与有符号整数运算相关,无符号整数运算即使结果超出了范围也不会设置 OF。
-
辅助进位标志(Auxiliary Carry Flag, AF):
- 当执行 BCD(二进制编码的十进制)码加法或减法运算时,如果低 4 位向高 4 位产生了进位或借位,AF 会被设置为 1。
- 这个标志位主要用于处理 BCD 码的算术运算。
-
奇偶标志(Parity Flag, PF):
- 当运算结果中值为 1 的二进制位数是偶数个时,PF 会被设置为 1;否则设置为 0。
- 这个标志位通常用于奇偶校验,判断数据的奇偶性。
-
中断标志(Interrupt Flag, IF):
- 当 IF 被设置为 1 时,处理器允许外部或内部中断;当 IF 被设置为 0 时,处理器忽略中断请求。
- 这个标志位用于控制中断的使能状态。
-
方向标志(Direction Flag, DF):
- 当 DF 被设置为 1 时,字符串操作指令(如 MOVSB、CMPSB 等)会按减地址方向执行;当 DF 被设置为 0 时,按增地址方向执行。
- 这个标志位用于控制字符串操作指令的执行方向。
我们需要知道,除了上面的一些标志bit比特位之外,RFLAGS
寄存器中还会存在其它的一些标志bit比特位。但由于其它标志bit比特位的作用相对特殊或较少被真正使用,因此这里就不一一讲述了。在实际汇编语言编程中,了解