我试图找出Linux中ASLR的工作方式,我编写了一个简单的c程序,如下所示:
void simple(void)
{
printf("simple func\n");
}
int main(void)
{
simple();
printf("address is %p \n.", (void*)&simple);
return 0;
}
在上面的代码中,我只打印了简单函数的位置地址,并且在上面的代码的所有执行中,我得到的是简单函数的相同地址,但是由于ASLR,我希望得到一个简单的函数的随机地址程序的每次执行?我错了,ASLR不应该这样做吗? 当然,当我运行“ ldd app.o”时,每次为不同的库我都会得到一个随机地址。
答案 0 :(得分:2)
Fedora / CentOS / Redhat和其他大概的发行版默认配置为使用-no-pie
(位置独立的可执行文件)构建,从而防止了可执行文件本身的ASLR。
您可以使用-pie
明确启用它:
gcc -pie app.c -o app && ./app