为什么.data可执行?

时间:2015-03-24 14:51:22

标签: linux executable elf

根据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(Alloc)权限,.data部分加载LOAD部分{{1} (阅读)R(写)。

然而,根据GDB,W部分中的shellcode是可执行的:

.data

我不知道为什么。它是否正确?我错过了什么?

1 个答案:

答案 0 :(得分:2)

  

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

GDB输出告诉您.data部分是可执行的。 GDB很乐意拆解你要求它拆解的任何内存。

试试这个:

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

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