NASM中调用/bin/bash执行带参脚本的问题及动态数组需求
问题1:脚本无法接收参数的原因及修复
你的execve参数数组构造逻辑本身是正确的,但脚本接收不到参数可能有以下几点原因及修复方式:
- 确认脚本内是通过
$1获取参数:bash执行脚本时,$0是脚本自身路径,传递的参数从$1开始,若脚本里误用了$0则无法拿到参数。 - 确保参数数组严格符合execve要求:
argv数组必须以NULL指针结尾,你的代码已经满足(最后一个dd 0),同时script和script_arg的字符串都已正确以0结尾,这部分无需修改。 - 禁止直接拼接参数到脚本路径:这种操作会让bash把带参数的字符串当作完整文件名查找,自然找不到对应文件,导致终端异常。
问题2:在.bss段定义可修改的参数数组
.bss段用于存放未初始化数据,适合定义需要运行时动态修改的数组,具体实现步骤:
- 在.bss段预留空间:用
resd(保留双字,对应32位指针)定义数组,比如预留4个双字位置(3个参数指针+1个NULL指针):
SECTION .bss arguments resd 4 ; 预留4个双字空间,用于存储指针
- 在代码段运行时赋值:通过内存偏移逐个给数组元素赋值,每个双字占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
相关产品推荐
相关产品推荐

