《xchg rax,rax》片段分析0x05--区间条件跳转
前言
本次是该系列的的第0x05篇
实验环境:
- Windows10 + VS2022 + masm
0x05
代码片段链接:xorpd | xchg rax,rax 0x05
sub rax,5
cmp rax,4
代码分析
cmp指令
cmp指令实际上进行比较的方式是通过减法运算进行,对标志位的影响等同于sub指令
sub指令对标志位的影响
如果相减结果为正数,则CF=0,ZF=0
如果相减结果为负数,则CF=1,ZF=0
如果相减结果为零数,则CF=0,ZF=1
代码片段分析
这个片段在逆向的时候我也见过,C语言的switch case 跳转功能就有类似的操作,当case情况依次是4,5,6,7,8,9时,机器码会把条件变量减去4,然后根据是否为0,进行跳转,然后逐步减一进行比较跳转:
switch (argv)
00007FF62C281076 83 E9 04 sub ecx,4
00007FF62C281079 74 72 je main+7Dh (07FF62C2810EDh)
00007FF62C28107B 83 E9 01 sub ecx,1
00007FF62C28107E 74 55 je main+65h (07FF62C2810D5h)
00007FF62C281080 83 E9 01 sub ecx,1
00007FF62C281083 74 38 je main+4Dh (07FF62C2810BDh)
00007FF62C281085 83 E9 01 sub ecx,1
00007FF62C281088 74 1B je main+35h (07FF62C2810A5h)
00007FF62C28108A 83 F9 01 cmp ecx,1
00007FF62C28108D 75 63 jne main+82h (07FF62C2810F2h)
case 8:addition += 5; break;
00007FF62C28108F 8D 51 04 lea edx,[rcx+4]
default:
break;
这里代码片段的含义是产生一个数减去另一个数(5)大于或小于一个值(4)的两种情况,通过ZF标志位来区分,从而进行判断跳转
测试判断:
当rax = 8 ,ZF=0,CF=1
当rax = 9 ,ZF=1,CF=0
当rax = 10,ZF=0,CF=0
可以使用根据ZF和CF标志位进行跳转的指令进行条件转移,可在这里查阅条件跳转指令:Jcc — Jump if Condition Is Met (felixcloutier.com)
比如jbe
就满足要求,当CF=1或ZF=1时跳转,也就是小于等于时跳转,在本例下就是4-9之间的数值会进行跳转
测试代码:
.code
main proc
lea rax, [18]
sub rax,5
cmp rax,4
ret
main ENDP
END
参考资料
Jcc — Jump if Condition Is Met (felixcloutier.com)
SUB — Subtract (felixcloutier.com)
(vs2010、vs2013、vs2015、vs2017查看OF、ZF、SF标志位_CJ_xiaoni的博客-CSDN博客