linux - 执行参数错误

标签 linux assembly x86

我想用 excve() 执行下一个:/bin/sh ABC。 三个参数是一个字符数组(1 个字符 = 1 个字节),但是 strace 实用程序说我正在尝试执行:

execve("//bin/sh", ["//bin/sh", "ABC", 0x6e69622f, 0x68732f, ...], [/* 0 vars */]) = -1 EFAULT (Bad address)

功能:

int execve(const char* filename, char* const argv[], char* const envp[])

这是我的代码:

push 0x00434241  ; "ABC\0"
mov esi, esp     ; &"ABC\0"
push 0x0068732f  ; "/sh\0"
push 0x6e69622f  ; "/bin"
mov ebx, esp     ; &"//bin/sh\0"
push esi         ; &"ABC\0"
push ebx         ; &"//bin/sh\0"
mov ecx, esp     ; args["//bin/sh\0", "ABC\0"]
push 0           ; NULL ; NULL NULL NULL NULL
mov edx, esp     ; envp[NULL]

最佳答案

argv 数组需要以零终止。在push esi前加一个push 0

关于linux - 执行参数错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28262709/

相关文章:

x86 - 是否可以设置在 cpu 写入特定地址时中断的中断?

C++ 中 SSE/AVX 的 x86 CPU 调度

c - GCC 内联汇编 - 在调用之前将 float 移动到 XMM0

c++ - 如果没有 libRcpp.so 文件,我如何链接 Rcpp?

c++ - 将 float 与参数内的字符串连接起来

linux - 启动时如何加载模块?它们在启动时加载的顺序是什么?怎么改?

assembly - 将16位实模式代码链接到兼容Multiboot的ELF可执行文件时出现LD错误

c++ - 自动对象住在哪里(附演示)

assembly - FILD 和 FSTP 指令

linux - 用于本地(非远程)命令执行的 ssh 隧道