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。由于可执行文件中缺少一些(全部?),您可能会怀疑动态链接器没有遵循规范。链接器可能正在跟踪并试图使事情正常进行。