c语言指针指向字符串单个,C语言 有没有可能调用一个指向字符串的函数指针?...
我是個在學C的萌新,一天突發(fā)奇想,指令和數(shù)據只是對人來說才有意義,
一段二進制串對CPU來說既可是數(shù)據,也可是指令,IP指向哪里就當作指令執(zhí)行。那這樣的話是不是意味著可以在C中執(zhí)行字符串呢?
可,在探索中我發(fā)現(xiàn)沒那么簡單。Program received signal SIGSEGV, Segmentation fault
我不確定這背后具體原因,我想可能是系統(tǒng)的保護機制。想到內存可執(zhí)行可寫等屬性會不會有影響,于是加上mprotect。但,還是不行。或許除代碼段外的其它段都是不可執(zhí)行的?
所以調用一個字符串可行嗎?
如果不可行有具體的原因嗎?
如果您抽空回答,我十分感謝!
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可執(zhí)行屬性,但不管用
puts("justAFun函數(shù)16進制表示: ");
do
{
printf("%#x",justACharPtr[i] & 0xFF); //顯示justAFun的'內容'
} while((justACharPtr[i++] & 0xFF) != 0xc3 && putchar(','));
putchar('\n');
justAFun(justAJust); //非常普通的調用justAFun
justAPtr = justAFun; //使用函數(shù)指針調用justAFun
justAPtr(justAJust);
justAPtr = (void (*)(char *))justAString; //嘗試調用一個字符串
justAPtr(justAJust);
return 0;
}
`
總結
以上是生活随笔為你收集整理的c语言指针指向字符串单个,C语言 有没有可能调用一个指向字符串的函数指针?...的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: linux SPI通信超时,提高SPI时
- 下一篇: c语言对分查找实验报告,C语言实验指导.