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

时间:2016-08-29 16:57:50

标签: 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("[*] 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 222222test()函数运行..

我的代码是:

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

但没有跑!

2 个答案:

答案 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);