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

NASM中调用/bin/bash执行带参脚本的问题及动态数组需求

问题1:脚本无法接收参数的原因及修复

你的execve参数数组构造逻辑本身是正确的,但脚本接收不到参数可能有以下几点原因及修复方式:

  • 确认脚本内是通过$1获取参数:bash执行脚本时,$0是脚本自身路径,传递的参数从$1开始,若脚本里误用了$0则无法拿到参数。
  • 确保参数数组严格符合execve要求:argv数组必须以NULL指针结尾,你的代码已经满足(最后一个dd 0),同时script和script_arg的字符串都已正确以0结尾,这部分无需修改。
  • 禁止直接拼接参数到脚本路径:这种操作会让bash把带参数的字符串当作完整文件名查找,自然找不到对应文件,导致终端异常。
问题2:在.bss段定义可修改的参数数组

.bss段用于存放未初始化数据,适合定义需要运行时动态修改的数组,具体实现步骤:

  1. 在.bss段预留空间:用resd(保留双字,对应32位指针)定义数组,比如预留4个双字位置(3个参数指针+1个NULL指针):
SECTION .bss
      arguments resd 4  ; 预留4个双字空间,用于存储指针
  1. 在代码段运行时赋值:通过内存偏移逐个给数组元素赋值,每个双字占4字节,所以偏移量依次加4:
_start:
    ; 给.bss段的arguments数组动态赋值
    mov dword [arguments], command    ; 第一个元素:bash路径指针
    mov dword [arguments + 4], script ; 第二个元素:脚本路径指针
    mov dword [arguments + 8], script_arg ; 第三个元素:脚本参数指针
    mov dword [arguments + 12], 0    ; 第四个元素:NULL指针结尾

    ; 调用execve系统调用
    mov edx, 0
    mov ecx, arguments
    mov ebx, command
    mov eax, 11
    int 80h

后续若要修改参数,直接修改对应偏移位置的内存值即可。

相关文档指引

可参考NASM官方文档的以下部分:

  • 段定义章节:理解.data、.bss等段的作用与使用规则
  • 内存寻址章节:掌握通过偏移量访问数组元素的方法
  • Linux系统调用章节:明确execve系统调用的参数格式要求(ebx为程序路径,ecx为argv数组指针,edx为环境变量数组指针)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.22 00:45:36