为什么 .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
,因为它实际上 不是 可执行文件。
根据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
,因为它实际上 不是 可执行文件。