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

时间:2014-01-09 21:09:10

标签: 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)();
}

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

更新

((void(*)(void))code)();

似乎代替这三条线。

3 个答案:

答案 0 :(得分:8)

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

那是:

  

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

答案 1 :(得分:3)

两个问题:

  1. shell代码可能位于非可执行内存中。为了使其可执行,您需要要求操作系统使其可执行(例如,使用mprotect(2)VirtualProtect()),或者分配新的可执行内存并将其复制到那里(例如使用{{3} }或mmap(2)
  2. 您的shell代码不会返回/退出。在CPU执行NOP(0x90)之后,它将继续执行NOP指令之后的内存中的代码。最有可能的是,这会很快崩溃,但它可能会做其他随机的,不可预测的事情。
  3. 要修复#2,你需要显式执行返回指令(x86 / x86-64上的C3)从shell代码返回,或者你需要做一些永不返回的事情,比如调用VirtualAlloc()功能。

答案 2 :(得分:3)

也许你应该改变你的变量:

   char shellcode[]

要:

   const char shellcode[]

喜欢这个问题: segmentation-fault-error-when-exe-c

这个对我有用! :)

相关问题