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)
tostrtol(argv[1],NULL,16)代码>内存地址以16为基数,而不是以10为基数
尝试更改strtol(argv[1],NULL,10)
tostrtol(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
。您正在将其解析为十进制。除此之外,这是一个可怕的黑客。