逆向05:JCC

JCC指令

JMP:修改EIP的值

1
JMP 0x12345678

其指令相当于MOV EIP, [寄存器/立即数],但这个指令是非法的。

CALL:调用其他函数

1
CALL 0x12345678

CALL [地址A/寄存器]指令相当于下方指令,但下方的指令是非法的。

1
2
PUSH [地址B]
MOV EIP, [地址A/寄存器]

JMP命令相同的是其修改了EIP的值,但不同的是其会修改ESP(栈顶)的值为调用点下一条指令的地址(返回地址)。

RET:返回

相当于:

1
2
LEA ESP, [ESP+4]
MOV EIP, [ESP-4]

JCC指令表

指令 含义 检查符号位 符号 条件
JZ/JE jump if Zero / jump if Equal ZF = 1 i == 0 / i == j 若为0/相等时跳转
JNZ/JNE jump if not zero / jump if Not Equal ZF = 0 i != j / i != 0 若为1/不相等时跳转
JS jump if Sign SF = 1 i < 0 若为负时跳转
JNS jump if Not sign SF = 0 i > 0 若为正时跳转
JP/JPE jump if Parity(Even) PF = 1 若中1的个数为偶数则跳转
JNP/JPO jump if Not Parity(Odd) PF = 0 若中1的个数为奇数则跳转
JO jump if Overflow OF = 1 若溢出则跳转
JNO jump if Not Overflow OF = 0 若无溢出则跳转
JC/JB/JNAE jump if Carry / Below / Not Above Equal CF = 1 i < j (无符号)若进位/低于/不高于等于则跳转
JNC/JNB/JAE jump if Not Carry / Not Below / Above Equal CF = 1 i >= j (无符号)若无进位/不低于/高于等于则跳转
JBE/JNA jump if Below Equal / Not Above ZF / CF = 1 i <= j (无符号)若低于等于则跳转;若不高于则跳转
JNBE/JA jump if Not Below Equal / Above ZF / CF = 0 i > j (无符号)若不低于等于则跳转;若高于则跳转
JL/JNGE jump if Less / Not Greater Equal SF != OF si < sj (有符号)若小于则跳转;若不大于等于则跳转
JNL/JGE jump if Not Less / Greater Equal SF == OF si >= sj (有符号)若不小于则跳转;若大于等于则跳转
JLE/JNG jump if Less Equal / Not Greater ZF != OF || ZF == 1 si <= sj (有符号)若小于等于则跳转;若不大于则跳转
JNLE/JG jump if Less Equal / Not Greater SF = OF && ZF == 0 si > sj (有符号)若不小于等于则跳转;若大于则跳转

比较指令

CMP指令

指令格式:CMP R/M, R/M/IMM,参数不可同时为内存。

该指令用于比较两个操作数,它相当于SUB指令,但是相减的结果并不保存到第一个操作数中,且改变相应标志位。

1
2
3
MOV EAX, 100
MOV ECX, 100
CMP EAX, ECX

运行上方指令后,ZF(零标志位)为1。

TEST指令

指令格式:TEST R/M, R/M/IMM,参数不可同时为内存。

该指令相当于AND指令,但是相减的结果并不保存到第一个操作数中,且改变相应标志位。

这个指令常用于测试某个寄存器是否为0。

1
TEST EAX, EAX

运行上方指令后,观察ZF(零标志位),当EAX值为0时,ZF为1。


Built with Hugo
主题 StackJimmy 设计