我是个在学C的萌新,一天突发奇想,指令和数据只是对人来说才有意义,

一段二进制串对CPU来说既可是数据,也可是指令,IP指向哪里就当作指令执行。那这样的话是不是意味着可以在C中执行字符串呢?

可,在探索中我发现没那么简单。Program received signal SIGSEGV, Segmentation fault

我不确定这背后具体原因,我想可能是系统的保护机制。想到内存可执行可写等属性会不会有影响,于是加上mprotect。但,还是不行。或许除代码段外的其它段都是不可执行的?

所以调用一个字符串可行吗?

如果不可行有具体的原因吗?

如果您抽空回答,我十分感谢!

Ps:如果觉得我上面说的和下面的代码很幼稚,那还望多多指教。谢谢 >_

#include

#include

#define NOP 0x90

#define M_SIZE 128

/*

在Ubuntu19.04 gcc version 8.3.0 (Ubuntu 8.3.0-6ubuntu1) 中编译通过

*/

static char justAJust[] = "Hello world!";

//这是个我自己构造的字符串,其功能是同justAFun一样的

static char justAString[M_SIZE] = {0x55,0x48,0x89,0xe5,

0x48,0x83,0xec,0x10,

0x48,0x89,0x7d,0xf8,

0x48,0x8b,0x45,0xf8,

0x48,0x89,0xc7,0xe8,

0xe8,0xcf,0xff,0xff,

0x90,0xc9,0xc3,0x90};

void justAFun(char *justAJust){

puts(justAJust);

}

int main(int args,char *argv[]){

int i = 0;

char *justACharPtr = NULL;

void (*justAPtr)(char *) = NULL;

justACharPtr = (char *) justAFun;

memset(&justAString[strlen(justAString)],NOP,M_SIZE-strlen(justAString));

mprotect(justAString,24,PROT_EXEC | PROT_READ); //尝试去赋予justString可执行属性,但不管用

puts("justAFun函数16进制表示: ");

do

{

printf("%#x",justACharPtr[i] & 0xFF); //显示justAFun的'内容'

} while((justACharPtr[i++] & 0xFF) != 0xc3 && putchar(','));

putchar('\n');

justAFun(justAJust); //非常普通的调用justAFun

justAPtr = justAFun; //使用函数指针调用justAFun

justAPtr(justAJust);

justAPtr = (void (*)(char *))justAString; //尝试调用一个字符串

justAPtr(justAJust);

return 0;

}

`

c语言指针指向字符串单个,C语言 有没有可能调用一个指向字符串的函数指针?...相关推荐

  1. c语言cin取字符串,c – 是否可以从cin中读取一个空字符串,并且仍然可以从cin.good()获得真实的字符串?...

    我的问题基于这个简单的代码: #include using namespace std; int main() { string buf; while (cin >> buf && ...

  2. C#调用C++接口 -- delegate实现函数指针

    C++接口定义 //回调函数定义 typedef void (CALLBACK *PDEVICE_FIND_CALLBACK_V40)(const SADP_DEVICE_INFO_V40 *lpDe ...

  3. 【C 语言】指针 与 数组 ( 指针 | 数组 | 指针运算 | 数组访问方式 | 字符串 | 指针数组 | 数组指针 | 多维数组 | 多维指针 | 数组参数 | 函数指针 | 复杂指针解读)

    相关文章链接 : 1.[嵌入式开发]C语言 指针数组 多维数组 2.[嵌入式开发]C语言 命令行参数 函数指针 gdb调试 3.[嵌入式开发]C语言 结构体相关 的 函数 指针 数组 4.[嵌入式开发 ...

  4. C语言指针的那些事:第三篇(函数指针,指针函数,函数指针数组,指向函数指针数组的指针)

    文章目录 1. 函数指针 1)函数指针的例题 2. 指针函数 3. 函数指针数组 1)函数指针数组的用途 4. 指向函数指针数组的指针 5. 一些后话 1. 函数指针 函数指针就是指向函数的指针:本质 ...

  5. C语言基础10——指针进阶。字符指针、指针数组、数组指针、函数指针、函数指针数组、回调函数、数组名详解、杨氏矩阵、字符串旋转

    目录 字符指针 指针数组 数组指针 数组传参.指针参数 函数指针 函数指针数组 指向函数指针数组的指针 回调函数 练习 数组名的意义 指针笔试题 字符指针 字符指针的另一种使用方式 #include ...

  6. 面试官问你斐波那契数列的时候不要高兴得太早 搞懂C语言函数指针 搜索引擎还可以这么玩? 那些相见恨晚的搜索技巧...

    面试官问你斐波那契数列的时候不要高兴得太早 前言 假如面试官让你编写求斐波那契数列的代码时,是不是心中暗喜?不就是递归么,早就会了.如果真这么想,那就危险了. 递归求斐波那契数列 递归,在数学与计算机 ...

  7. C语言函数指针的应用——自制谐波分析软件

    文章目录 函数指针简介 格式介绍 颜色头文件 计算机仿真 使用说明 完整代码 部分效果图 函数指针简介 如果在一个大型C语言程序中要反复调用函数,而调用的函数又不明确时,函数指针就是一个非常有用的东西 ...

  8. c语言指针赋值指针变量赋值吗,C语言_指针变量的赋值与运算,很详细

    指针变量的赋值 指针变量同普通变量一样,使用之前不仅要定义说明, 而且必须赋予具体的值.未经赋值的指针变量不能使用, 否则将造成系统混乱,甚至死机.指针变量的赋值只能赋予地址, 决不能赋予任何其它数据 ...

  9. c语言指针的错误使用,C语言指针常见错误用法

    C语言指针常见错误用法 1.使用未初始化的指针 int *p; *p = 5; 解释:p是一个指向未知地址的指针,给p赋值,相当于给一个未知地址的内存赋值,非常危险. 2.错用指针 int chang ...

最新文章

  1. 十天学Linux内核之第二天---进程
  2. linux系统无线驱动在哪下载,在linux上怎么安装无线网卡驱动?
  3. python之微信好友统计信息
  4. HDU 3591 The trouble of Xiaoqian
  5. [Kubernetes] 如何关联PVC到特定的PV
  6. 有关于腾讯地图服务端IP定位接口的获取当前城市的处理
  7. Sql Server 日期格式化函数
  8. 关于用mybatis调用存储过程时的入参和出参的传递方法
  9. html list列表
  10. ros服务器打开网页变慢了,解决ros 在计算机没有限速情况下,有几个网站打开很慢,或者打不开。...
  11. SQL Server练习
  12. gophp解释器_golang底层用什么语言实现的
  13. 修复计算机命令行,如何用命令提示符修复系统还原_用cmd命令提示符恢复系统的方法...
  14. 决策规划算法二:生成参考线(FEM_POS_DEVIATION_SMOOTHING)
  15. 前端H5各种qq,微博,fb,whatsapp等网页分享的链接
  16. 除了屏下无孔全面屏,红魔7系列还有这些黑科技
  17. 3.16 使用历史纪录画笔工具 [原创Ps教程]
  18. elm and halogen
  19. 华硕vm520up加固态硬盘和内存条
  20. 解决量产工具导致Intel(R) 6 Series/C200 Series Chipset Family USB Enhanced Host Controller - 1C26驱动感叹号

热门文章

  1. 进程间通信——匿名管道
  2. 【安全漏洞】CVE-2021-1732 win32k漏洞分析
  3. 【网络安全】XSS盲打实战案例:某网页漫画
  4. python实现维吉尼亚加密法
  5. HDU 1232 -畅通工程(并查集)
  6. sql 199标准 连接查询
  7. JVM中GC小对象配置
  8. oracle有 哪些常用视图,oracle常用视图
  9. Oracle 11g安装步骤详谈
  10. 轻松看懂java设计模式简单工厂模式