为什么数据段和堆栈段是可执行的?
- 2024-10-23 08:47:00
- admin 原创
- 73
问题描述:
我刚刚注意到我的简单程序的数据和堆栈段是可执行的。我在 /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
。如果任何目标文件需要可执行堆栈或数据,则将为整个段设置。
相关推荐
热门文章
项目管理软件有哪些?
- 2024年20款好用的项目管理软件推荐,项目管理提效的20个工具和技巧
- 2024年开源项目管理软件有哪些?推荐5款好用的项目管理工具
- 项目管理软件有哪些?推荐7款超好用的项目管理工具
- 项目管理软件哪个最好用?盘点推荐5款好用的项目管理工具
- 项目管理软件有哪些最好用?推荐6款好用的项目管理工具
- 项目管理软件有哪些,盘点推荐国内外超好用的7款项目管理工具
- 2024项目管理软件排行榜(10类常用的项目管理工具全推荐)
- 项目管理软件排行榜:2024年项目经理必备5款开源项目管理软件汇总
- 2024年常用的项目管理软件有哪些?推荐这10款国内外好用的项目管理工具
- 项目管理必备:盘点2024年13款好用的项目管理软件
热门标签
云禅道AD