IDA PRO 实践05 - 标志寄存器

处理器执行一个操作数为 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 的主要用途包括:

  1. 加法运算:如果在加法运算中发生了进位(即结果超出了寄存器的位数),CF 会被设置为 1;如果没有进位,CF 会被清零(0)。

  2. 减法运算:在减法运算中,CF 表示是否发生了借位。如果发生借位,CF 会被设置为 1;否则为 0。

  3. 无符号比较:在进行无符号整数比较时,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 标志位的设置规则:

  1. 加法运算

    • 当两个有符号数相加的结果超出了其表示范围时,OF 会被设置为 1。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

二手的程序员

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值