Linux C语言中的意外分段错误
我正在编写一个Linux shell代码漏洞。我的目标C代码是: 为什么编译和运行这个C程序会引起分段错误?该字符串是使用系统调用Int 0x80/EAX=1退出程序的shell代码。程序集中的原始利用漏洞代码为: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,因此
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