selph
selph
发布于 2022-01-06 / 335 阅读
0
0

《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博客


评论