C 从命令行中的地址调用函数

C 从命令行中的地址调用函数,c,gcc,C,Gcc,我从那里为调用函数编写了以下代码: $ 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("[*

我从那里为调用函数编写了以下代码:

$ 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
$ 

但是不要跑

内存地址在基16而不是基10中
尝试更改
strtol(argv[1],NULL,10)
to
strtol(argv[1],NULL,16)

内存地址以16为基数,而不是以10为基数
尝试更改
strtol(argv[1],NULL,10)
to
strtol(argv[1],NULL,16)

但是,确实应该使用16而不是10,因为地址始终是十六进制格式的,但是即使参数是10,代码也可以正常运行。由于此赋值,您的代码正在产生分段错误:
m=num
。这将为m指定一个任意值,而不是测试地址,并且在调用
(*m)(
时,当m指向无效位置时,会产生分段错误。应将最后两行更改为:

num=m;
(*num)();

这将正确运行测试功能

但是,确实应该使用16而不是10,因为地址总是十六进制格式,但是即使参数是10,代码也可以正常运行。由于此赋值,您的代码正在产生分段错误:
m=num
。这将为m指定一个任意值,而不是测试地址,并且在调用
(*m)(
时,当m指向无效位置时,会产生分段错误。应将最后两行更改为:

num=m;
(*num)();

这将正确运行测试功能

它是十六进制的
8048444
。您正在将其解析为十进制。除此之外,这是一个可怕的黑客攻击。它是十六进制的
8048444
。您正在将其解析为十进制。除此之外,这是一个可怕的黑客。