为什么我会出现分段错误?(测试Shellcode)

Goo*_*ies 7 c segmentation-fault shellcode

我写了一个简单的ASM文件并在我编写的C文件中运行它.我得了一个太阳故障.但是,当我执行编译的ASM文件时,我没有得到任何错误.

我正在运行64位并使用32位shellcode.这是问题吗?

它不可能,因为我得到了一个分段错误:

char shellcode[] = "\x90"; //simple NOP in ASM
int main(int argc, char **argv)
{
  int (*ret)();
  ret = (int (*)()) shellcode;
  (int)(*ret)();
}
Run Code Online (Sandbox Code Playgroud)

有人可以运行这个并告诉我他们是否会出现分段错误.我也使用了3或4个其他C文件.没有人工作过.

更新:

((void(*)(void))code)();
Run Code Online (Sandbox Code Playgroud)

似乎代替这三条线.

Ray*_*Ray 9

如上所述,shellcode位于非可执行存储器中.尝试使用-fno-stack-protector和-z execstack标志重新编译程序.

那是:

gcc -fno-stack-protector -z execstack -O OutputFileName yourShellCode.c


Ada*_*eld 3

两个问题:

  1. shell 代码可能位于不可执行的内存中。为了使其可执行,您需要要求操作系统使其可执行(例如使用mprotect(2)VirtualProtect()),或者分配新的可执行内存并将其复制到那里(例如使用mmap(2)VirtualAlloc().
  2. 您的 shell 代码不会返回/退出。CPU 在此处 (0x90) 执行 NOP 后,它将继续执行该 NOP 指令之后的内存中的代码。最有可能的是,这会很快崩溃,但它可能会做其他随机的、不可预测的事情。

要修复#2,您需要显式执行返回指令(C3在 x86/x86-64 上)以从 shell 代码返回,或者您需要执行一些永远不会返回的操作,例如调用函数exit(3)