【问题标题】:Meaning of BND RET in x86x86 中 BND RET 的含义
【发布时间】:2017-08-20 19:30:54
【问题描述】:

我正在对 CRT 库(尤其是 SEH 序言)进行一些反汇编时,突然遇到了这条奇怪的指令 bnd ret。谁能解释一下c3(ret opcode)之前的f2前缀的含义?

【问题讨论】:

  • @fuz 这就是我的想法,但是 REPNE RET (F2 C3) 用于英特尔的 MPX 扩展,而通常是 REP RET (F3 C3) 用于填充 RET 指令以避免分支预测旧 AMD CPU 上的问题。
  • @Ross 这是有道理的。但我不明白前缀如何避免分支错误预测。
  • @fuz 好吧,原始发帖人显然同意你的观点,即它是重复的,这就是社区投票关闭的来源。
  • 我认为这个答案关闭得太快了。 bndrep 不同。 bnd 用于启用 MPX 的代码以确保检查分支(和返回)。由于如果不支持 MPX 则无操作,因此始终将其添加到库函数中可以避免发布两个库版本(带和不带 MPX)。
  • 我还在__chkstk 实现中看到了bnd jae(操作码f2 73)。

标签: assembly x86 return disassembly opcode


【解决方案1】:

BND 前缀是Intel MPX (Memory Protection Extensions) 的一部分,表示返回目标(或通常是分支目标,因为 BND 可应用于任何控制流指令)应根据 BND0 到 BND3 寄存器中指定的边界进行检查,否则将产生异常——表明潜在的堆栈溢出、编程错误或恶意代码攻击。

在不支持 Intel MPX 的处理器上,或者当 MPX 被禁用时,BND 前缀表现为无操作,因此无需编译两个版本的代码(一个带有 BND 前缀,一个不带 BND 前缀)。

注意 BND 前缀的编码和 REPNE 前缀的编码是一样的(都是 F2),所以不知道 MPX 的老反汇编器可能会将此指令序列显示为 REPNE RET(或 REPNE JMP, REPNE CALL 等)。这种用法与 REP RET idiom 无关,后者假定前缀具有无操作行为,纯粹用于解决旧 CPU 上的性能问题。

【讨论】:

    猜你喜欢
    • 2013-07-11
    • 2022-12-10
    • 1970-01-01
    • 2021-07-05
    • 2013-12-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多