机器码作为shellcode运行时段错误

来源:互联网 发布:财务金融知乎 编辑:程序博客网 时间:2024/04/30 17:56

将一些C语言代码汇编后得到的机器码可以作为shellcode注入到一个新的进程中去,如果执行这个新的代码那么就可以运行注入得到的机器指令。

比如下一段代码:

#include <stdlib.h>char shellcode[] = "\xeb\x19\x31\xc0\x31\xdb\x31\xc9\x31\xd2\xb0\x04"\                    "\xb2\x0e\x59\xb3\x01\xcd\x80\x31\xc0\xb0\x01"\                    "\x31\xdb\xcd\x80\xe8\xe2\xff\xff\xff"\                    "\x48\x65\x6c\x6c\x6f\x2c\x20\x57\x6f\x72\x6c"\                    "\x64\x21\x0a";int main(int argc, char **argv) {    int (*ret)();    ret = (int(*)())shellcode;    (int)(*ret)();    exit(0);}

如果直接编译运行的话,结果可能就是段错误,比如:

$ gcc 1.c -o sc$ ./sc Segmentation fault (core dumped)

这是因为shellcode是以全局字符数组变量的形式存储在进程堆栈中的数据段中,数据段是没有可执行权限的,所以一旦PC寄存器进入到这里面,那么程序就会报错。

解决方法有两个,一个是在gcc编译的时候加入-z execstack参数,比如

$ gcc 1.c -o sc -z execstack$ ./scHello, World!
也可以安装execstack这个软件,然后在用命令将要运行的程序用execstack -s ./prog。那么该程序就解除可执行栈的保护了。

$ sudo apt-get install execstack$ execstack -s ./sc$ ./sc
$ Hello, World!
这样就可以运行了。


0 0
原创粉丝点击