我从那里写了这个呼叫功能代码:
$ cat main.c
#include <stdlib.h>
#include <stdio.h>
int test(){
printf("%s\n","[*] i'm in test");
return 1;
}
int main(int argc,char **argv){
int (*m)();
m=&test;
printf("[*] test func addr is: %p\n", m);
(*m)();
return 0;
}
$ gcc -o main main.c
$ ./main
[*] test func addr is: 0x8048414
[*] i'm in test
$
没问题
但我想要运行函数,并在命令行中从argv
传递地址..
例如,如果函数test()
的地址是0x222222
,我想在运行程序后使用此命令./main 222222
,test()
函数运行..
我的代码是:
$ cat main.c
#include <stdlib.h>
#include <stdio.h>
int test(){
printf("%s\n","[*] i'm in test");
return 1;
}
int main(int argc,char **argv){
int (*m)();
long conv ;
int num;
num=conv=strtol(argv[1],NULL,10);
printf("[*] argv[1] is: %d\n", num);
m=&test;
printf("[*] test func addr is: %p\n", m);
m=num;
(*m)();
return 0;
}
$ gcc -o main main.c
main.c: In function ‘main’:
main.c:17:3: warning: assignment makes pointer from integer without a cast [enabled by default]
$ ./main 8048444
[*] argv[1] is: 8048444
[*] test func addr is: 0x8048444
Segmentation fault (core dumped)
$
但没有跑!
答案 0 :(得分:2)
但是,确实使用16而不是10,因为地址始终采用十六进制格式,但即使参数为10,您的代码仍然可以正常运行。您的代码正在生成分段错误因为这项任务:m=num
。这会将任意值分配给m而不是test的地址,并且在调用(*m)()
时会产生分段错误,因为m指向无效的位置。您应该将最后两行更改为:
num=m;
(*num)();
这将正确运行测试功能。
答案 1 :(得分:1)
内存地址位于16位而不是10位
尝试将strtol(argv[1],NULL,10);
更改为strtol(argv[1],NULL,16);