根据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
我不知道为什么。它是否正确?我错过了什么?
答案 0 :(得分:2)
然而,根据GDB的说法,.data部分中的shellcode是可执行的:
GDB输出不告诉您.data
部分是可执行的。 GDB很乐意拆解你要求它拆解的任何内存。
试试这个:
(gdb) set $p = (void (*)(void))&bytecode
(gdb) call $p()
这会在SIGSEGV
的第一条指令上产生bytecode
,因为它实际上是不是可执行文件。