Linux 即使部分不可执行,程序也会运行

Linux 即使部分不可执行,程序也会运行,linux,assembly,x86,Linux,Assembly,X86,我的主要部分定义为section.code write 我故意删除了exec参数,并注意到在组装和链接之后,程序运行良好 objdump-d myprogram为空。 gdb无法调试它:break\u start表示“函数\u start未定义”,但info variables显示\u start 但该程序仍在运行。怎么可能呢 体系结构是基于linux(ubuntu 12)的英特尔32位 probram正在执行execve系统调用,打开一个/bin/sh shell nasm计划: global

我的主要部分定义为
section.code write

我故意删除了
exec
参数,并注意到在组装和链接之后,程序运行良好

objdump-d myprogram
为空。 gdb无法调试它:
break\u start
表示“函数\u start未定义”,但
info variables
显示
\u start

但该程序仍在运行。怎么可能呢

体系结构是基于linux(ubuntu 12)的英特尔32位

probram正在执行execve系统调用,打开一个/bin/sh shell

nasm计划:

global _start

section .code write

_start:
        jmp short call_shellcode

shellcode:
        pop esi

        xor ebx, ebx
        mov byte [esi +7], bl
        mov dword [esi +8], esi
        mov dword [esi +12], ebx

        lea ebx, [esi]
        lea ecx, [esi +8]
        lea edx, [esi +12]

        xor eax, eax
        mov al, 0xb
        int 0x80

call_shellcode:
        call shellcode
        message db "/bin/shABBBBCCCC"

你在为什么体系结构编程?在更新后的帖子中添加了你在使用什么汇编程序?法斯姆?我假设您的CPU是奔腾II或更高版本,因此它支持PAE页表,从而支持NX位。但如果不是这样,Linux就无法在过时的2级x86 32位页表上使页可读但不可执行。检查
/proc/PID/maps
../smaps
,查看包含入口点地址的映射是否位于内核使其可执行的映射中。您使用
节.code
而不是标准的
.text
?用于定义
\u start
而不是普通的
\u start
?无论如何,您可以使用
starti
命令(而不是
run
)让GDB在第一条指令之前停止,或者在像您这样的较旧GDB上,
b*0
然后
运行
。然后删除无效的断点。表示可执行文件将获得标志,如
pfux
ET\u EXEC
DT\u EXEC
和friends。由于可执行文件中缺少一些(全部?),您可能会怀疑动态链接器没有遵循规范。链接器可能正在跟踪并试图使事情正常进行。