我正在写汇编,我想弄清楚如何执行一个execve系统调用,而不是输出打印到终端,我想知道它的存储位置,所以我可以稍后使用它,有点像管道命令。在汇编中执行它后,如何将execve系统调用的输出返回到寄存器或堆栈?
例如,这里的组件,用于执行所述命令“其”经由execve的,基本上执行命令“$其中LS”:
GLOBAL _start
SECTION .TEXT
_start:
XOR EAX,EAX
PUSH EAX
PUSH 0x68636968
PUSH 0x772f6e69
PUSH 0x622f7273
PUSH 0x752f2f2f
MOV EBX, ESP
PUSH EAX
PUSH 0x736c
MOV ESI, ESP
XOR EDX, EDX
PUSH EDX
PUSH ESI
PUSH EBX
MOV ECX, ESP
MOV AL, 0x0B; EXECVE SYSCALL NUMBER
INT 0x80
7-10行推/usr/bin/which
到堆栈的地址,和第13行将参数ls
推入堆栈。然后它将参数数组推入堆栈并将其存储在ECX中,使EBX指向/usr/bin/which
位置的地址,并将EAX设置为execve系统调用的系统调用号0xb(11)。执行时,它会返回/bin/ls
,我们要求它找到ls
的位置。
如何将/bin/ls
的结果存储在某处供其他用途使用?就像如果我想继续编写代码并使用这里返回的代码作为下一段代码的一部分,我该如何将返回值保存在寄存器或堆栈中?
[重定向exec输出到缓冲区或文件]的可能重复(https://stackoverflow.com/questions/2605130/redirecting-exec-output-to-a-buffer-or-file)。 –
execve不会返回,除非它失败。 – stark