为什么我会收到分段错误? (测试Shellcode)

问题描述:

我写了一个简单的ASM文件,并在我写的C文件中运行它。我有一个严重的错误。但是,当我执行编译的ASM文件时,我没有遇到任何错误。为什么我会收到分段错误? (测试Shellcode)

我正在运行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)(); 

似乎到位那些三行的是工作。

+1

这不是你如何使用内联汇编器......首先,你使用的是哪种编译器? [Here](http://asm.sourceforge.net/articles/rmiyagi-inline-asm.txt)是你如何使用“gcc”来完成的。 –

+0

我觉得我们有一个endian和stack frame的问题。 – BLUEPIXY

+1

在什么平台上(什么操作系统,什么编译器)?这可能是因为你的堆不可执行。 – Gilles

两个问题:

  1. shell代码可能会在非可执行内存。为了使其可执行文件,你需要或者要求的操作系统,使其可执行文件(例如,用mprotect(2)VirtualProtect()),或分配新的可执行内存,并复制它在那里(例如,用mmap(2)VirtualAlloc()
  2. 你的shell代码没有按” t返回/退出当CPU执行你的NOP(0x90)之后,它将继续执行NOP指令后面的内存中的代码,这很可能会很快崩溃,但它可能会做其他随机的,不可预知的事情。

要解决#2,你需要明确或者执行返回指令(C3在x86/x86-64的)从你的shell代码返回,或者你需要做的事情,从来没有重轮流,就像拨打exit(3)函数一样。

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

即:

GCC -fno-堆栈保护-z execstack -O OutputFileName yourShellCode.c

+0

或者,也可以运行'execstack OutputFileName'上已编译的二进制。没有 – WhiteWinterWolf

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

char shellcode[] 

收件人:

const char shellcode[] 

像这样的问题: segmentation-fault-error-when-exe-c

这一个为我工作! :)

+0

这些补充参数做到了 OS:Arch Linux的x86_64的 内核版本:4.9.8-1拱 正常运行时间:2:41 WM:I3 DE:无 套餐:765 RAM:2405 MB/5963 MB 处理器类型:Intel(R)Core(TM)i5 CPU中号430 @ 2.27GHz $ EDITOR:无 根:16G/69G(23%)(EXT4) –