建網(wǎng)站 陜西牛人網(wǎng)絡(luò)科技百度推廣的定義
修改RIP相關(guān)指令
0x70-0x7F (JCC)
- 條件跳轉(zhuǎn),后面跟一個(gè)字節(jié)立即數(shù)的偏移(有符號(hào)),共兩個(gè)字節(jié)(定長(zhǎng)指令)
- 如果條件成立,跳轉(zhuǎn)到當(dāng)前指令地址 + 當(dāng)前指令長(zhǎng)度 + lb
- 向前跳7F,向后跳80
上圖中70-7f的硬編碼為jcc跳轉(zhuǎn)指令(定長(zhǎng)),可以看到大于等于80是向上跳,而小于80是向下跳
這是一個(gè)字節(jié)的情況
我們來看下兩個(gè)字節(jié)的JO等指令如何查表(指令相同但硬編碼不同):
首先查主表Table A-2 0F的位置
他告訴我們這個(gè)指令是2個(gè)字節(jié),要我們?nèi)ゲ門able A-3的表,我們?cè)俳又門able-3 80的位置
Table A-3. Two-byte Opcode Map: 80H — F7H (First Byte is 0FH) * 查這張表
對(duì)應(yīng)的是Jcc指令,再看一下上面的一排小字 (Jccf64, Jz - Long-displacement jump on condition)意思是:64位模式下忽略操作數(shù)大小前綴,強(qiáng)制使用64位,長(zhǎng)位移跳躍條件
這些2個(gè)字節(jié)的jcc指令也有向上跳和向下跳的區(qū)分,大于等于0x80000000向上,反之向下
其他修改RIP的指令
- 0xE0
- RCX = RCX -1 當(dāng) ZF標(biāo)志位 = 0 && ECX != 0 時(shí)跳轉(zhuǎn)到當(dāng)前指令地址 + 當(dāng)前指令長(zhǎng)度 + 偏移
- 0xE1
- RCX = RCX -1 當(dāng) ZF標(biāo)志位 = 1 && ECX != 0 時(shí)跳轉(zhuǎn)到當(dāng)前指令地址 + 當(dāng)前指令長(zhǎng)度 + 偏移
- 0xE2
- RCX = RCX -1 當(dāng) ECX != 0 時(shí)跳轉(zhuǎn)到當(dāng)前指令地址 + 當(dāng)前指令長(zhǎng)度 + 偏移
- 0xE3
- 當(dāng)RCX = 0 時(shí)跳轉(zhuǎn)到當(dāng)前指令地址 + 當(dāng)前指令長(zhǎng)度 + 便宜
- 0xE8
- CALL指令的下一條地址
- 0xE9
- JMP指令跳轉(zhuǎn)
- 0xEA
- JMP 跨段跳轉(zhuǎn)
- 0xEB
- JMP 短地址跳轉(zhuǎn)
- 0xC3
- RIP出棧
- 0xC2
- RIP出棧后,RSP = RSP + Iw
- 0xCB
- 出棧8個(gè)字節(jié),低4個(gè)字節(jié)賦值給RIP,高4個(gè)字節(jié)中低2位賦值給CS
- 0xCA
- 出棧8個(gè)字節(jié),低4個(gè)字節(jié)賦值給RIP,高4個(gè)字節(jié)中低2位賦值給CS,RSP = RSP + Iw