在某一时刻,英特尔将开始推出支持CET(Control-flow E增强T技术的CPU,后者增加了ENDBR64和ENDBR32两个指令。
这两个将被编码为
F3 0F 1E FA for ENDBR64 and
F3 0F 1E FB for ENDBR32 respectively. 如何在旧的x86 CPU上执行这些操作?
例如,核心i5,甚至是老式的奔腾II?
更新:
F3 0F = prefix indicating newer instructions
1E = ENDBR
FA = ENDBR64发布于 2019-05-14 02:44:32
旧的GDB将F3 0F 1E FA ENDBR64解码为repz nop edx。
在64位模式下,在核心2 (Merom)上单步执行不会导致体系结构状态的变化,也不会产生故障/异常。(在GDB 7.10上测试了一个旧的Ubuntu 15.10安装)。
据https://gist.github.com/Quasilyte/b60c94b9cb608d5b1a359d54f1be8aca称,
0f 1e /r 是一个2字节的操作码,它采用ModRM,NOP r/m32, r32,与标准的多字节诺普,英特尔的文件相同。
它说它添加了奔腾Pro,所以任何的PII / PIII或更高版本都可以。
https://github.com/NationalSecurityAgency/ghidra/issues/197#issuecomment-472906147说AMD记录了这些额外的NOP操作码;英特尔将它们列为“保留”。
对于不适用的操作码,通常会忽略rep 前缀。使英特尔/AMD可以灵活地使用REP作为将来指令的强制性前缀,以创建不会在旧CPU上出错的编码。
CPU比PPro老,例如原始奔腾,可能会在它上产生错误。就像0f 1f long NOP一样。
顺便说一句,你想把它解码是毫无意义的。0f是2字节操作码的“转义”字节,因此1e push ds与其解码方式无关。这就是1e自己解码的方式,没有0f转义字节。(除非在64位模式下无效。)
发布于 2019-12-06 19:24:02
最近我自己也遇到了ENDBR32指令方面的问题。VirtualBox版本6.0.14_Ubuntu r132055错误地将ENDBR32解码为非法操作码和STI序列。这将产生各种错误,因为我需要中断禁用。我想出的唯一解决方案是启用-fcf-protection=branch和-mmanual-endbr选项来调用GCC。
https://stackoverflow.com/questions/56120231
复制相似问题