我写了一个简单的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)();
似乎代替这三条线。
答案 0 :(得分:8)
如上所述,shellcode位于非可执行内存中。尝试使用-fno-stack-protector和-z execstack标志重新编译程序。
那是:
gcc -fno-stack-protector -z execstack -O OutputFileName yourShellCode.c
答案 1 :(得分:3)
两个问题:
mprotect(2)
或VirtualProtect()
),或者分配新的可执行内存并将其复制到那里(例如使用{{3} }或mmap(2)
。要修复#2,你需要显式执行返回指令(x86 / x86-64上的C3
)从shell代码返回,或者你需要做一些永不返回的事情,比如调用VirtualAlloc()
功能。
答案 2 :(得分:3)
也许你应该改变你的变量:
char shellcode[]
要:
const char shellcode[]
喜欢这个问题: segmentation-fault-error-when-exe-c
这个对我有用! :)