我刚刚注意到我的简单程序的数据和堆栈段是可执行的。
我在 /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
then
nasm -f elf64 prog.asm
ld -o prog prog.o
./prog
使程序执行int3指令。
用 C 编写并使用 gcc 构建的程序的数据、堆栈和堆不可执行,那么为什么用汇编语言编写的程序会有不同的行为呢?
在现代 Linux 系统上,链接器会将堆栈/数据标记为不可执行IFF参与链接的所有对象都有一个特殊的“标记”部分.note.GNU-stack
.
如果你编译例如int foo() { return 1; }
进入装配体(与gcc -S foo.c
),你会看到这个:
.section .note.GNU-stack,"",@progbits
For nasm
,语法如手册第 8.9.2 节;你想要这样的东西:
section .note.GNU-stack noalloc noexec nowrite progbits
Note
必须这样做every .o
进入可执行文件的文件。如果任何目标文件需要可执行堆栈或数据,则为整个段设置它。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)