参考了其他文章。
C语言代码如下:
#include <stdio.h>
#include <string.h>
char sc[] =
"\x31\xc0"
"\x50"
"\x68\x6e\x2f\x73\x68"
"\x68\x2f\x2f\x62\x69"
"\x89\xe3"
"\x50"
"\x53"
"\x89\xe1"
"\xb0\x0b"
"\xcd\x80";
int main()
{
void (*fp)(void) = (void (*)(void))sc;
printf("Length: %d\n",strlen(sc));
fp();
}
上面的sc就是shellcode。源代码保存为execve.c,然后编译、连接。
[yang@localhost ~]$ gcc -o execve execve.c
[yang@localhost ~]$ ./execve
Length: 23
娈甸敊璇
[yang@localhost ~]$
结果如上,没有执行shellcode,怎么回事?我的gcc版本是4.3.0的。这个版本的gcc,编译出来的可执行文件的堆栈段,是不可执行的。
加上参数-z execstack就能变成可执行了。
[yang@localhost ~]$ gcc -z execstack -o execve execve.c
[yang@localhost ~]$ ./execve
Length: 23
sh-3.2$
获得了一个shell