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

本文探讨了如何将C语言编译后的机器码作为shellcode注入进程,并指出在执行时可能出现的段错误问题。解决方案是通过在gcc编译时添加'-z execstack'参数来允许执行栈。
摘要由CSDN通过智能技术生成

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值