Ubuntu x86环境下汇编代码调用bash触发段错误求助
问题分析与修复
你的汇编代码触发段错误的核心原因是路径字符串构造顺序错误,以及插入了多余空字节,导致execve无法正确识别/bin/bash路径。
具体问题点:
- 栈是向下生长的(地址从高到低),当前push顺序会让栈内的字符串片段顺序颠倒,且插入了不必要的空字节:你当前push的顺序是
0→"bash"→0x0000002f(带三个空字节的/) →"/bin",最终栈中内容是/bin\0\0\0/bash\0,execve会把/bin当作完整路径,执行失败后触发段错误。 - 禁止添加额外斜杠的要求没问题,但需要正确拼接字符串片段,避免空字节插入。
修复后的代码:
section .text global _start _start: ; 构造/bin/bash字符串(栈中从后往前push,适配栈向下生长的特性) xor eax, eax push eax ; 字符串终止符0 push "bash" ; 压入"bash"(4字节,无空字节) push "/bin" ; 压入"/bin"(4字节,无空字节) mov ebx, esp ; ebx指向栈顶,即"/bin/bash"的起始地址 ; 构造argv数组 xor eax, eax push eax ; argv[1] = NULL push ebx ; argv[0] = "/bin/bash" mov ecx, esp ; ecx指向argv数组起始地址 ; 环境变量为空 xor edx, edx ; 调用execve mov al, 0x0b ; execve的系统调用号(x86 Linux) int 0x80
修复说明:
- 正确的字符串顺序:因为栈向下生长,从字符串末尾
bash开始push,再push/bin,栈顶地址就是/bin/bash的起始位置,整个字符串连续无多余空字节:/bin/bash\0。 - 避免多余空字节:直接push4字节对齐的字符串常量,
/bin本身已包含路径分隔符,拼接后正好是目标路径,完全符合禁止添加额外斜杠的要求。 - 其余逻辑保持正确:argv数组、环境变量的构造,以及系统调用的调用方式均适配x86 Ubuntu环境。
编译链接命令(x86环境):
nasm -f elf32 yourfile.asm -o yourfile.o ld -m elf_i386 yourfile.o -o yourfile ./yourfile
内容的提问来源于stack exchange,提问作者Nazarii Shvets
相关产品推荐
相关产品推荐

