为什么 .data 是可执行的?

Why is .data executable?

根据readelf

----------------------------------------------------------------------
  [Nr] Name              Type             Address           Offset
       Size              EntSize          Flags  Link  Info  Align
  [24] .data             PROGBITS         0000000000601040  00001040
       0000000000000051  0000000000000000  WA       0     0     32
----------------------------------------------------------------------
Section to Segment mapping:
Segment Sections... 
00
01
02  
03     .init_array .fini_array .jcr .dynamic .got .got.plt .data .bss
----------------------------------------------------------------------
Program Headers:
  Type           Offset             VirtAddr           PhysAddr
                 FileSiz            MemSiz              Flags  Align
  PHDR           
  INTERP       
  LOAD
  LOAD           0x0000000000000e10 0x0000000000600e10 0x0000000000600e10
                 0x0000000000000281 0x0000000000000288  RW     200000

如您所见,.data 段具有 W(写入)和 A(分配)权限,并且 .data 加载到 LOAD 部分 R(读取)W(写入)。

然而,根据 GDB,.data 部分的 shellcode 是可执行的:

   0x601060 <bytecode>:     xor    rax,rax
=> 0x601063 <bytecode+3>:   xor    rdi,rdi

我也不知道为什么。这个对吗?我错过了什么?

However, the shellcode in the .data section is executable, according to GDB:

GDB 输出没有告诉您 .data 部分是可执行的。 GDB 会很乐意地反汇编您要求它反汇编的任何内存。

试试这个:

(gdb) set $p = (void (*)(void))&bytecode
(gdb) call $p()

这应该会在 bytecode 的第一条指令上产生 SIGSEGV,因为它实际上 不是 可执行文件。