将一些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寄存器进入到这里面,那么程序就会报错。