为什么nop
分配到0x90
intel x86 程序集上?
直觉上,我希望这0x00
会映射到nop
(也在xchg eax, eax
intel x86 上),因为它是ARM A32
和其他一些架构的情况一样。
为什么nop
分配到0x90
intel x86 程序集上?
直觉上,我希望这0x00
会映射到nop
(也在xchg eax, eax
intel x86 上),因为它是ARM A32
和其他一些架构的情况一样。
0x00000000 实际上不是 ARM A32 上的 NOP,尽管它的行为类似于一个;实际上andeq r0, r0, r0
,真正的 NOP 是0xe1a00000
(mov r0, r0)。让 NUL 字节成为 NOP 是一个相当糟糕的主意,因为这会使每个空内存区域都成为空闲的 NOP 滑动,从而大大增加了攻击的风险。现代架构通常尝试使全零成为中断指令或类似指令,以避免这种攻击向量。例如,ARM A64 制作0x00000000
了一条永久未定义的指令udf 0
。
0x90
实际上只是0x90 + r
操作码系列的一条指令,它代表xchg r32, eax
. eax
是寄存器 0,所以0x90
代表xchg eax, eax
它是一个 NOP。在长模式下,0x90
特殊情况下不将高 32 位清零rax
以保持其作为单字节 NOP 的功能。