运行shellcode时出现分段错误

时间:2014-10-31 09:17:41

标签: c gcc buffer-overflow shellcode

我正在尝试使用shellcode,然后深入研究它,所以我从shellcoders手册中找到了一个例子。示例如下:

char shellcode[] = "\xeb\x1a\x5e\x31\xc0\x88\x46\x07\x8d\x1e\x89\x5e\x08\x89\x4
\x0c\xb0\x0b\x89\xf3\x8d\x4e\x08\x8d\x56\x0c\xcd\x80\xe8\xe1\xff\xff\xff\x2f\x62\x69
\x6e\x2f\x73\x68";

int main() {

int *ret;
ret = (int *)&ret + 2;
(*ret) = (int)shellcode;
}

shellcode应该生成一个shell。但是我得到了分段错误错误。 我使用带有gcc-fno-stack-protector选项的-z execstack编译器编译了程序。我快速查看了readelf命令,很明显堆栈是可执行的

 GNU_STACK      0x000000 0x00000000 0x00000000 0x00000 0x00000 RWE 0x4

2 个答案:

答案 0 :(得分:2)

ret是一个指针,当你声明它时它不指向任何内存位置。 稍后你试图通过向指针指向的位置添加2来为它分配一些值。(这是矛盾的陈述)

ret = (int *)&ret + 2;/* Which is wrong */

答案 1 :(得分:0)

我使用“gcc filename.cpp”命令编译以下代码。 Ti的编译没有错误。我希望这可以帮助你解决你的疑问。

#include<stdio.h>

char shellcode[] = "\xeb\x1a\x5e\x31\xc0\x88\x46\x07\x8d\x1e\x89\x5e\x08\x89\x4\x0c\xb0\x0b\x89\xf3\x8d\x4e\x08\x8d\x56\x0c\xcd\x80\xe8\xe1\xff\xff\xff\x2f\x62\x69\x6e\x2f\x73\x68";

int main() {

int *ret;
ret = (int *) ret + 2; //I don't know why you had written this
ret = (int *)shellcode;

}