%reg:value 在 ATT 程序集中是什么意思?

逆向工程 拆卸 x86 部件
2021-06-23 10:52:15

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

(gdb) disas
Dump of assembler code for function foo:
   0x000000000040057c <+0>: push   %rbp
   0x000000000040057d <+1>: mov    %rsp,%rbp
   0x0000000000400580 <+4>: sub    $0x20,%rsp
   0x0000000000400584 <+8>: mov    %edi,-0x14(%rbp)
=> 0x0000000000400587 <+11>:    mov    %fs:0x28,%rax
   0x0000000000400590 <+20>:    mov    %rax,-0x8(%rbp)
   0x0000000000400594 <+24>:    xor    %eax,%eax
   0x0000000000400596 <+26>:    mov    $0x4006ac,%edi
   0x000000000040059b <+31>:    callq  0x400440 <puts@plt>
   0x00000000004005a0 <+36>:    mov    -0x8(%rbp),%rax
   0x00000000004005a4 <+40>:    xor    %fs:0x28,%rax
   0x00000000004005ad <+49>:    je     0x4005b4 <foo+56>
   0x00000000004005af <+51>:    callq  0x400450 <__stack_chk_fail@plt>
   0x00000000004005b4 <+56>:    leaveq 
   0x00000000004005b5 <+57>:    retq   

这种语法的含义是什么?

1个回答

%fs:028h实际上是使用形式segment:offset,这意味着它正在到达28h远段选择的段中偏移量处的内存地址FS

任何内存引用都有一个隐式段(大多数情况下,CS用于执行,DS用于数据读/写),它可以被段前缀覆盖。