gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:55:21 30 4
gpt4 key购买 nike

我正在尝试使用 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 中产生垃圾。这是因为系统调用 execve 需要更多参数。

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

作为额外信息,段错误是因为在您执行系统调用之后,您将在 rax 中遇到错误,您将移动 60 到 rax 的最后 8 位并调用这个不存在的系统调用。

关于linux - 为什么我的 shellcode 在从 C 执行时会出现段错误,而不是作为独立的可执行文件执行?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48833809/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com