处理器执行一个操作数为 2 个寄存器的指令时,无法判别这是有符号还是无符号数的运算。读者会知道是因为可以从后面那个条件跳转指令来判断。所以处理器同时考虑这 2 种情况,并且触发对应的标志。
使用 IDA 调试 crackme.exe 程序,运行到程序入口暂停。
如果使用 keypatch 修改指令后,发现汇编指令变成 db 形式了,记得先把修改的那段 Undefine,然后再转成 Code。
CF(CARRY FLAG)
测试一
随便可以触发到的地方打个断点,让程序运行到断点处。
使用 Keypatch 插件将第一句指令改为 ADD EAX, 1。
在 EAX 寄存器右键单击,选择 MODIFY VALUE,输入 0xffffffff。
按 F8 键单步执行,观察 CF 标志位变化。可以看到计算结果超过了数值上限,因而触发了 CF 标志。
测试二
再将下一条指令改为 SUB EAX, EDX。
如果两个无符号数相减结果为负这种错误,同样也会触发 CF。修改寄存器使得 EAX=0x25,EDX=0x40,同样可以看到,CF 还是为 1。
测试三
将下一条指令修改为 SUB EAX, EDX 这条指令,并设置 EAX=0x100,EDX=0x40。
按 F8 键单步执行。结果没有触发 CF 标志。
那么结论是:
在 ARM64 架构中,CF(Carry Flag,进位标志)是一个用于表示算术运算结果的状态标志。CF 的主要用途包括:
-
加法运算:如果在加法运算中发生了进位(即结果超出了寄存器的位数),CF 会被设置为 1;如果没有进位,CF 会被清零(0)。
-
减法运算:在减法运算中,CF 表示是否发生了借位。如果发生借位,CF 会被设置为 1;否则为 0。
-
无符号比较:在进行无符号整数比较时,CF 用于指示一个值是否小于另一个值。例如,使用
CMP指令进行比较时,如果第一个操作数小于第二个操作数,CF 会被设置为 1。
CF 在许多指令中都会受到影响,包括加法、减法、位操作等,通常用于控制条件分支和处理复杂的算术逻辑。
OF(OVERFLOW FLAG)
OF 标志类似于 CF,但它是针对有符号数的。
测试一
将下一条指令改为 ADD EAX,1 指令,并使 EAX=0x7fffffff。
按 F8 键单步执行。
因为最大正数 0x7fffffff 加上 1 之后变成 0x80000000 是一个负数,产生了错误,所以触发了 OF。
测试二
同样再将 EAX(0x80000000)减去 EDX(0x40)的值。
按 F8 键执行,再次触发 OF,因为最小负数 0x80000000 减去 0x40 之后结果是一个很大正数,所以产生了错误。
OF 标志位的设置规则:
-
加法运算:
-
当两个有符号数相加的结果超出了其表示范围时,OF 会被设置为 1。
-

最低0.47元/天 解锁文章
2万+

被折叠的 条评论
为什么被折叠?



