为什么我的shellcode在从C执行时会出现段错误,而不是作为一个独立的可执行文件?

时间:2018-02-16 19:44:44

标签: linux assembly nasm x86-64 shellcode

我正在尝试使用shellcode执行shell。我用64位机器制作了这段代码:

section .text
    global _start

_start:
    xor rax, rax
    push rax
    mov rbx, "/bin//sh"
    push rbx
    mov rdi, rsp
    mov al, 59
    syscall

    mov al, 60
    xor rdi, rdi
    syscall

使用nasm并使用ld链接后,如果我执行该文件,这可以正常工作。问题是如果我从中获取shellcode并尝试使用此程序执行它:

int main(){
    char *shellcode = "\x48\x31\xc0\x50\x48\xbb\x2f\x62\x69\x6e\x2f\x2f\x73\x68\x53\x48\x89\xe7\xb0\x3b\x0f\x05\xb0\x3c\x48\x31\xff\x0f\x05";

    (*(void(*)()) shellcode)();
}

它给我一个分段错误错误。我看不出这里有什么问题。任何帮助将不胜感激。

编辑:已经尝试gcc -z execstack使堆栈可执行,仍然会出现分段错误错误

1 个答案:

答案 0 :(得分:4)

这是正常的,因为你的shellcode没有设置寄存器rsi和rdx,当你的C程序执行时,shellcode会在寄存器rdi和rdx中产生垃圾。这是因为系统调用 execve 需要更多参数。

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

作为额外信息,分段错误是因为在你的execve系统调用之后你将在rax中得到一个错误,你将把60移到rax的最后8位并调用这个不存在的系统调用。