如何将参数传递给 execve 以在 x64 Asm 中执行 cat 文件?

逆向工程 部件 C 外壳代码 x86-64
2021-07-02 21:13:40

我要execve("/bin/cat",["/bin/cat","/test/file"],NULL)

这是我的 asm

xor %rdx, %rdx 
push %rdx

sub $0x16, %rsp
movb $0x2f, 7(%rsp)
movl $0x2f6e6962, 8(%rsp)
movl $0x746163, 12(%rsp)
leaq 7(%rsp), %rdi

pushq %rdx

push %rdi

mov %rsp, %rsi

movb $0x3b, %al 
syscall

这个汇编,我只能得到`execve("/bin/cat",["/bin/cat"],NULL)。

如何在 rsi 中传递参数“/test/file”?

1个回答

execve 规范说:

argv 和 envp 都必须以 NULL 指针结束。

但从你的问题来看,你似乎忘记了它;你想这样称呼它:

execve("/bin/cat", ["/bin/cat","/test/file", NULL], NULL)

如果它仍然不起作用,这里是 C 中的工作代码。然后您可以按照 @user3629249 的建议并使用它gcc -S nameOfProgram来生成程序集,或者只是编译它并查看objdump -d nameOfProgram.

#include <unistd.h>

int main()
{
    char* argv[3] = {"/bin/cat", "/test/file", NULL};
    execve("/bin/cat", argv, NULL);
}