Linux C语言中的意外分段错误

Linux C语言中的意外分段错误,linux,gcc,assembly,x86,shellcode,Linux,Gcc,Assembly,X86,Shellcode,我正在编写一个Linux shell代码漏洞。我的目标C代码是: 为什么编译和运行这个C程序会引起分段错误?该字符串是使用系统调用Int 0x80/EAX=1退出程序的shell代码。程序集中的原始利用漏洞代码为: b0 01 mov al,0x1 31 db xor ebx,ebx cd 80 int 0x80 您不是在设置eax=0x1,而是在设置al=0x1,因此

我正在编写一个Linux shell代码漏洞。我的目标C代码是:

为什么编译和运行这个C程序会引起分段错误?该字符串是使用系统调用Int 0x80/EAX=1退出程序的shell代码。程序集中的原始利用漏洞代码为:

b0 01                   mov    al,0x1
31 db                   xor    ebx,ebx
cd 80                   int    0x80

您不是在设置
eax=0x1
,而是在设置
al=0x1
,因此,如果您不知道在外壳代码之前执行了哪些指令,您将拥有
eax=xxxxxx 01


正如评论所说,您必须在外壳代码的开头执行一个
xor eax,eax

什么是
func
?这可能就是错误发生的地方。我是C新手。我正在尝试使用C运行字符串。@alexquilliamMake确保您在32位linux中,并且您的数据部分是可执行的。Jester是正确的。您的攻击代码是32位的,使用
int 0x80
。如果您发现自己在64位代码中向系统调用传递基于堆栈的指针,那么这可能会失败。您确实应该考虑使用<代码> SysCals< /Cult> 64位代码的指令。您需要使用
-z execstack
进行编译,以获得可执行堆栈。但同样重要的是,EAX/RAX寄存器的高位可能有垃圾。在将AL设置为1之前,先将整个寄存器归零。这将在字符串开头编码为额外的
\0x31\0xc0
(Int)(*func)()什么是Int?
b0 01                   mov    al,0x1
31 db                   xor    ebx,ebx
cd 80                   int    0x80