这是一些代码:
#include <stdio.h>
#include <string.h>
char globalbuf[256];
void function(char *argv) {
char localbuf[256];
strcpy(localbuf, argv);
strcpy(globalbuf, localbuf);
printf("localbuf addr: %p globalbuf addr: %p\n", localbuf, globalbuf);
}
int main(int argc, char **argv) {
function(argv[1]);
return 0;
}
我正在研究 ASLR 及其工作原理。有关操作系统和编译器的更多信息
gcc (Ubuntu/Linaro 4.7.2-2ubuntu1) 4.7.2
Linux 3.5.0-32-generic #53-Ubuntu SMP x86_64 x86_64 x86_64 GNU/Linux
所以当我执行这段代码时,我看到一个不断变化的localbuf地址。这很好,因为我知道 ASLR 已启用并设置为完全随机模式。但是globalbuf地址始终保持不变。我知道未初始化的全局变量和静态变量是 BSS 部分的一部分;因此我假设 BSS、文本和数据部分没有被 ASLR 随机化。
这个对吗?如果没有,我会链接到一篇 论文。第 2 页,最后一段是指我在这里的建议。
据我了解,每个进程都有自己的堆栈、堆、文本、bss 和数据部分/区域,因此每次生成一个进程时,都会为基指针分配一个随机地址,而其他一切都只是它的偏移量。如果是这样,为globalbuf打印什么,是偏移量吗?如何找到globalbuf的实际地址?