为什么数据段和堆栈段是可执行的?
- 2024-10-23 08:47:00
- admin 原创
- 246
问题描述:
我刚刚注意到我的简单程序的数据和堆栈段是可执行的。我在 /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
导致 prog 执行 int3 指令。
用 C 编写并使用 gcc 构建的程序的数据、堆栈和堆都是不可执行的,那么为什么用汇编编写的程序的行为方式会有所不同?
解决方案 1:
在现代 Linux 系统上,如果参与链接的所有对象都有一个特殊的“标记”部分,则链接器会将堆栈/数据标记为不可执行.note.GNU-stack
。
如果你将其编译int foo() { return 1; }
成汇编代码(使用gcc -S foo.c
),你会看到这样的情况:
.section .note.GNU-stack,"",@progbits
对于nasm
,语法如手册第 8.9.2 节所示;您需要类似这样的内容:
section .note.GNU-stack noalloc noexec nowrite progbits
笔记
必须对进入可执行文件的每个 文件执行此操作.o
。如果任何目标文件需要可执行堆栈或数据,则将为整个段设置。
相关推荐
热门文章
项目管理软件有哪些?
热门标签
曾咪二维码
扫码咨询,免费领取项目管理大礼包!
云禅道AD