我正在尝试使用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
使堆栈可执行,仍然会出现分段错误错误
答案 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位并调用这个不存在的系统调用。