本人代码如下:
#include<stdio.h>
int main()
{
int (* myshow)(const char *,...);
printf("HI!,printf'address is %#x\n",printf);
//把一个地址强制类型转换成函数
//myshow=(int (*)(const char *,...))0x8048300;
//myshow("123\n");
return 0;
}
(Ubuntu18.04)运行结果:
(Ubuntu12.04)运行结果:
由以上两图得,Ubuntu 18.04中的printf函数的地址是变动的,而Ubuntu 12.04中的printf函数的地址是不变的为什么哦?printf这个函数不应该在代码段中吗?怎么地址总会变哦?
2019.5.29 13:49
通过
cat /proc/sys/kernel/randomize_va_space
查看发现:
经过echo 0 > /proc/sys/kernel/randomize_va_space
操作
且把//myshow=(int (*)(const char *,...))0x8048300;//myshow("123\n");
这两句的屏蔽去掉后:
虽然地址没改变了,但不能使用地址访问的方式实现printf,这又是为什么哦?
另外,在Ubuntu12.04,查看/proc/sys/kernel/randomize_va_space文件,它显示的是2,但
能正常以地址访问的方式实现printf,且printf函数的地址不会改变。
我猜应该是
地址空间随机化
(ASLR
)的原因吧看一下随机化开关是不是打开了
如果不是0的话,你把它关掉,应该每次就是一样的结果了