簡體   English   中英

為什么從C執行而不是作為獨立的可執行文件執行shellcode segfault?

[英]Why does my shellcode segfault when executed from C, but not as a stand-alone executable?

我試圖用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使堆棧可執行,仍然給出分段錯誤錯誤

這是正常現象,因為您的shellcode並未設置寄存器rsi和rdx,並且當您的C程序執行時,shellcode在寄存器rdi和rdx中將存在垃圾。 這是因為syscall execve需要更多參數。

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

作為額外的信息,分段錯誤是因為在執行execve syscall之后,您將在rax中得到一個錯誤,並且將60移至rax的最后8位,並調用此不存在的syscall。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM