汇编调用带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
相关产品推荐
相关产品推荐

