Jun 10, 2024
安全

逆向基础 - 跳转与比较指令

跳转与比较指令介绍

逆向基础 - 跳转与比较指令
Posted by
SYSTEM· 135 次阅读
专栏系列逆向基础

JCC指令

cc 代表 condition code(状态码)

Jcc不是单个指令,它只是描述了跳转之前检查条件代码的跳转助记符

例如 JNE,在跳转之前检查条件代码

典型的情况是进行比较(设置CC),然后使用跳转助记符之一

X86ASM
CMP EAX,0
JNE XXXXX

条件代码也可以用AND、OR、XOR、加法、减法(当然也可以是CMP)等指令来设置

JCC指令用于改变EIP(CPU要读取的指令地址)

JMP指令

JMP指令:修改EIP的值

JMP指令只影响了EIP,不影响堆栈和其它通用寄存器

JMP 寄存器/立即数 相当于 MOV EIP,寄存器/立即数

CALL指令

CALL指令和JMP指令都会修改EIP的值

但CALL指令会将返回地址(CALL指令的下一条指令地址)压入堆栈

因此也会引起esp的变化

RET指令

call调用跳转后执行完相关代码完要返回到call的下一条指令时使用ret指令

ret指令相当于pop eip

比较指令

CMP指令

指令格式:CMP R/M,R/M/IMM

CMP指令只改变标志寄存器的值

该指令是比较两个操作数,实际上,它相当于SUB指令,但是相减的结果并不保存到第一个操作数中

只是根据相减的结果来改变ZF零标志位的,当两个操作数相等的时候,零标志位置1

例:

X86ASM
MOV EAX,100
MOV EBX,200
CMP EAX,ECX
CMP AX,WORD PTR DS:[405000]
CMP AL,BYTE PTR DS:[405000]
CMP EAX,DWORD PTR DS:[405000]

TEST指令

指令格式:TEST R/M,R/M/IMM

该指令在一定程度上和CMP指令时类似的,两个数值进行与操作,结果不保存,但是会改变相应标志位

与的操作表项如下:

运算结果
1 and 11
1 and 00
0 and 10
0 and 00

可以看到只要有任一操作数为0时,结果就为0

常见用法:用这个指令,可以确定某寄存器是否等于0

只有当eax=0时 eax and eax才会是0

所以

X86ASM
TEST EAX,EAX

观察ZF(零标志位)就可以判断EAX是否为0

JCC指令表

首先要明确一点,所有的判断跳转指令都是根据标志位来进行判断的

JCC 指令也只影响 EIP

指令英文全称含义判断标志位
JE, JZjump equal,jump zero结果为零则跳转(相等时跳转)ZF=1
JNE, JNZjump not equal,jump not zero结果不为零则跳转(不相等时跳转)ZF=0
JSjump sign结果为负则跳转SF=1
JNSjump  not sign结果为非负则跳转SF=0
JP, JPEjump parity,jump parity even结果中1的个数为偶数则跳转PF=1
JNP, JPOjump not parity,jump parity odd结果中1的个数为偶数则跳转PF=0
JOjump overflow结果溢出了则跳转OF=1
JNOjump not overflow结果没有溢出则跳转OF=0
JB, JNAEjump below,jump not above  equal小于则跳转 (无符号数)CF=1
JNB, JAEjump not below,jump above  equal大于等于则跳转 (无符号数)CF=0
JBE, JNAjump below equal,jump not above小于等于则跳转 (无符号数)CF=1 or ZF=1
JNBE, JAjump not below equal,jump above大于则跳转(无符号数)CF=0 and ZF=0
JL, JNGEjump less,jump not greater  equal小于则跳转 (有符号数)SF≠OF
JNL, JGEjump not less,jump greater  equal大于等于则跳转 (有符号数)SF=OF
JLE, JNGjump less equal,jump not greater小于等于则跳转 (有符号数)ZF=1 or SF≠OF
JNLE, JGjump not less equal,jump greater大于则跳转(有符号数)ZF=0 and SF=OF
评论交流
暂无评论,欢迎分享您的见解