【发布时间】:2020-03-29 20:56:19
【问题描述】:
我已经能够使用sys_write 成功地将字符串打印到 macOS 上的标准输出。但是,我无法使用 execve 系统调用和 echo 打印此堆栈字符串:
global _main
default rel
section .text
_main:
mov rbp, rsp
sub rsp, 32
mov rax, 'this a t'
mov [rbp-16], rax
mov rax, 'est'
mov [rbp-8], rax
mov rax, '/bin/ech'
mov [rbp-32], rax
xor rax, rax
mov al, 'o'
mov [rbp-24], rax
push 0
mov rax, 0
mov [rbp], rax
exit_program:
;rdi filename
;rsi argv
;rdx envp
lea rdi, [rbp-32]
lea rsi, [rbp-32]
mov rdx, 0
mov rax, 0x200003b
syscall
目前,我的返回是来自execve 的 EFAULT 状态代码。
屏幕截图中显示的内存布局是字符串“This is a test”,后跟用于终止的空字节。
更新:跟踪输出:execve("/bin/echo", [0x6863652f6e69622f, 0x6f, 0x7420612073696874, 0x747365], NULL) = -1 EFAULT (Bad address)
【问题讨论】:
-
@JimMischel 不幸的是没有。一种是 x86。另一个在这种情况下不起作用(尝试 rsp + 8 和 + 16 加载 cl arg)。
-
另外,您应该检查返回值。如果
execve成功,则不会返回。如果失败,则返回 -1。您可以在调用后放置一些代码,输出一个“调用失败”的字符串。至少你可以缩小错误存在的范围。 -
@JimMischel 最后一个链接很有帮助,但我仍然有些困惑,我想是因为我不熟悉 AT&T 语法,再加上答案是使用
movs 而不是推动 args。大多数情况下,我不确定如何正确终止参数字符串“这是一个测试”和 argv 数组本身,以及 envp。例如。我必须为 envp 推 0,然后为 0 来终止 argv,然后是堆栈数据吗?最后,我不确定他所说的“文件名”是什么意思,以及它在这里如何应用。
标签: string macos assembly stack nasm