当我反汇编一个函数时,有时会遇到%reg:value形式的表达式。通常,当我在GCC(-fstack-protector)中激活金丝雀时遇到这种语法,如以下示例所示:

#1 楼

%fs:028h实际上使用的格式为segment:offset,这意味着它正在到达由Far Segment 28h选择的段中的偏移量FS处的内存地址。任何内存引用都有一个隐式段(大多数情况下, CS用于执行,DS用于数据读/写),可以用段前缀覆盖。

评论


这是Linux,而不是Windows。

–伊戈尔·斯科钦斯基♦
13年5月3日在8:10

因此,我们可以这样写:0x28(%fs),为什么对同一事物使用另一种语法?

–恐怖
13年5月3日在8:48

@perror:请重新阅读Ange的答案。 FS是一个段寄存器,因此此语法意味着FS指向的段内有一个偏移量。没有从寄存器中提取位的语法(x86 ISA不支持这样的操作数)。 0x28(%fs)表示FS值加上0x28,这是另一回事。

–伊戈尔·斯科钦斯基♦
13年5月3日在8:49

好的,这意味着此处寻址的存储空间在物理存储空间而不是虚拟存储空间上。这是对的吗 ?

–恐怖
13年5月3日在8:53

@perror:不。 KM和UM之间的值可能不同。在UM中,除非存在巨大的安全漏洞,否则您永远不会直接看到物理内存。 fs和friends在平面地址模式下通常称为选择器,因为它们的含义与实模式下的含义完全不同。

– 0xC0000022L♦
13年5月3日,11:10