硬编码(修改RIP相关指令)
修改RIP相关指令
0x70-0x7F (JCC)
- 条件跳转,后面跟一个字节立即数的偏移(有符号),共两个字节(定长指令)
- 如果条件成立,跳转到当前指令地址 + 当前指令长度 + lb
- 向前跳7F,向后跳80
上图中70-7f的硬编码为jcc跳转指令(定长),可以看到大于等于80是向上跳,而小于80是向下跳
这是一个字节的情况
我们来看下两个字节的JO等指令如何查表(指令相同但硬编码不同):
首先查主表Table A-2 0F的位置
他告诉我们这个指令是2个字节,要我们去查Table A-3的表,我们再接着查Table-3 80的位置
Table A-3. Two-byte Opcode Map: 80H — F7H (First Byte is 0FH) * 查这张表
对应的是Jcc指令,再看一下上面的一排小字 (Jccf64, Jz - Long-displacement jump on condition)意思是:64位模式下忽略操作数大小前缀,强制使用64位,长位移跳跃条件
这些2个字节的jcc指令也有向上跳和向下跳的区分,大于等于0x80000000向上,反之向下
其他修改RIP的指令
- 0xE0
- RCX = RCX -1 当 ZF标志位 = 0 && ECX != 0 时跳转到当前指令地址 + 当前指令长度 + 偏移
- 0xE1
- RCX = RCX -1 当 ZF标志位 = 1 && ECX != 0 时跳转到当前指令地址 + 当前指令长度 + 偏移
- 0xE2
- RCX = RCX -1 当 ECX != 0 时跳转到当前指令地址 + 当前指令长度 + 偏移
- 0xE3
- 当RCX = 0 时跳转到当前指令地址 + 当前指令长度 + 便宜
- 0xE8
- CALL指令的下一条地址
- 0xE9
- JMP指令跳转
- 0xEA
- JMP 跨段跳转
- 0xEB
- JMP 短地址跳转
- 0xC3
- RIP出栈
- 0xC2
- RIP出栈后,RSP = RSP + Iw
- 0xCB
- 出栈8个字节,低4个字节赋值给RIP,高4个字节中低2位赋值给CS
- 0xCA
- 出栈8个字节,低4个字节赋值给RIP,高4个字节中低2位赋值给CS,RSP = RSP + Iw