向 JMP 指令添加 REP(N(E)) 前缀有什么影响?

逆向工程 x86
2021-06-13 23:37:34

我正在尝试对一个可执行的打包程序进行逆向工程,但我对这个 x86 指令有点困惑:

F2 EB F5    repne jmp short near ptr unk_88801B

根据英特尔手册,“jmp”指令不支持重复前缀。然而,IDA、Ollydbg 和 Capstone 将这条指令解码为上述内容。

这条指令出现在一段重叠的代码中以混淆它,所以我很确定不受支持的前缀只是为了支持重叠。

我的问题是处理器如何处理这条指令?它只是忽略前缀,抛出非法指令,还是完全忽略指令?

1个回答

这是一个很难回答的问题,因为我必须解释英特尔 MTX 是如何工作的,我不知道它是如何 100% 工作的,但我将在这里尝试:)

一开始我认为 IDA 给了你错误的反汇编代码(这不是真的,我稍后会解释)。因为你给了我额外的信息(操作码),我用rasm2组装它,我得到了这个:

$ rasm2 -a x86 -d "F2 EB F5"
bnd jmp 0xfffffff8

邦德!这不是非法指令,实际上它被称为 Intel MPX(内存保护扩展),它于 2013 年首次宣布并于 2015 年推出。

来自维基百科的
Intel MPX 是对 x86 指令集架构的一组扩展。借助编译器、运行时库和操作系统支持,英特尔 MPX 通过检查正常编译时意图因缓冲区溢出而在运行时被恶意利用的指针引用,提高了软件的安全性。

英特尔 MPX 提供了四个名为 bnd0-bnd3 的新寄存器,用于设置边界以避免内存攻击。我建议你阅读这个这个这个

回到你的问题。我认为将作为普通 jmp 工作,因为绑定寄存器未初始化。我怎么知道?您的操作码是 EB,如果您阅读文章,您将阅读此内容。

编译为使用英特尔 MPX 的应用程序将使用 REPNE (F2H) 前缀(由 BND 表示)用于所有形式的近 CALL、近 RET、近 JMP、短和近 Jcc 指令(BND+CALL、BND+RET、BND+JMP , BND+Jcc)。请参阅表17-4具体操作码。所有远 CALL、RET 和 JMP 指令加上短 JMP(JMP rel 8,操作码 EB)指令永远不会导致绑定寄存器被初始化

读到我也明白为什么 IDA 没有给你错误的代码。