You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

修复说明:

  1. 正确的字符串顺序:因为栈向下生长,从字符串末尾bash开始push,再push/bin,栈顶地址就是/bin/bash的起始位置,整个字符串连续无多余空字节:/bin/bash\0。
  2. 避免多余空字节:直接push4字节对齐的字符串常量,/bin本身已包含路径分隔符,拼接后正好是目标路径,完全符合禁止添加额外斜杠的要求。
  3. 其余逻辑保持正确: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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.09 03:16:02