我反汇编了一个简单的C程序(由gcc编译),负责放置堆栈金丝雀的说明如下:
mov %fs:0x28,%rax
mov %rax,-0x8(%rbp)
xor %eax,%eax
请注意,金丝雀为8个字节(rax
),但是只有4个字节(xor eax eax
)被清除。
这是故意的吗?看起来代码只是泄漏了堆栈金丝雀的一半。
使用amd64修改寄存器的低32位时,会将高32位清除。这与修改寄存器的任何下部时不同:例如,xor al, al
仅清除的8个低位rax
。
由于xor eax, eax
比短1个字节xor rax, rax
,因此编译器通常会选择第一个字节。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句