我刚刚注意到我的简单程序的数据和栈段是可执行的。
我在/proc/[pid]/maps中看到了它,并且使用简单代码确认了它。
例如:
; prog.asm
section .data
code: db 0xCC ;int3
section .text
global _start
_start:
jmp code
mov rax, 60 ; sys_exit
mov rdi, 0
syscall
然后nasm -f elf64 prog.asm
ld -o prog prog.o
./prog
导致程序执行int3指令。
C语言编写并使用gcc构建的程序具有不可执行的数据、栈和堆,因此为什么用汇编语言编写的程序会表现出不同的行为呢?
GNU_STACK
行为的来源吗?我看到你可以通过向ld
传递-z noexecstack
来使其具有相同的行为...但这不是一个加载器问题吗?当明确标记为noexec时,加载器将.data节映射为可执行文件。 - Marconasm
没有一个标志可以自动添加它。 - Marconasm
编译的部分默认情况下将不再在x86_64上可执行。请参见提交记录。 - Marco