22

私の単純なプログラムのデータとスタックセグメントが実行可能であることに気づきました。/ 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でビルドされたプログラムでは、データ、スタック、およびヒープが実行不可能です。それでは、アセンブリで記述されたプログラムの動作が異なるのはなぜですか。

4

1 に答える 1

22

最新の Linux システムでは、リンカーはスタック/データを非実行可能IFFにマークします。リンクに参加するすべてのオブジェクトには、特別な「マーカー」セクションがあり.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オブジェクト ファイルに実行可能なスタックまたはデータが必要な場合は、セグメント全体に設定されます。

于 2011-10-22T23:09:48.810 に答える