[英]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.