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

汇编调用带argv[]的bash命令失败:execve系统调用无输出求助

问题根源:execve参数传递格式错了

先明确x86_64 Linux下execve系统调用的寄存器规则:

  • RDI:存程序路径字符串的地址(这部分你没做错,"/bin/bash"的地址放这没问题)
  • RSI:必须存参数指针数组的地址,不是单个参数
  • RDX:存环境变量指针数组的地址,通常直接传0就能继承当前环境,省事

你现在把单个参数"-c"和命令字符串直接塞到RSI、RDX里,这完全不符合execve的要求。execve要求RSI指向一个数组,数组里的元素依次是:程序名指针、各个参数指针,最后必须用NULL结尾。

正确的参数构造方式

要执行/bin/bash -c "echo hello; ls -la",得先造一个argv数组,结构是这样的:

argv[0] = "/bin/bash"的地址
argv[1] = "-c"的地址
argv[2] = "echo hello; ls -la"的地址
argv[3] = NULL  // 这个空指针必须加,不然系统识别不了参数结尾

然后把这个数组的地址丢进RSI,RDX直接设成0就行。

给你个NASM风格的示例片段

section .data
    bash_path db "/bin/bash", 0
    arg_c     db "-c", 0
    cmd_str   db "echo hello; ls -la", 0
    ; 64位系统下指针是8字节,所以用dq定义数组元素
    argv      dq bash_path, arg_c, cmd_str, 0

section .text
    global _start
_start:
    mov rax, 59        ; execve的系统调用号
    mov rdi, bash_path ; 程序路径
    mov rsi, argv      ; 把参数数组的地址给RSI
    mov rdx, 0         ; 环境变量直接传0
    syscall            ; 触发系统调用

为啥之前没输出?

因为execve拿到的参数格式不对,bash根本没正确接收到-c和后续命令,自然不会执行对应的操作,直接退出了,所以你看不到任何输出。

内容的提问来源于stack exchange,提问作者Jimmyboy

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.25 02:55:00