首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >ASLR随机BSS

ASLR随机BSS
EN

Security用户
提问于 2013-06-12 15:26:11
回答 1查看 2.1K关注 0票数 5

以下是一些代码:

代码语言:javascript
复制
#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和它是如何工作的。有关操作系统和编译器的更多信息

代码语言:javascript
复制
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的实际地址?

EN

回答 1

Security用户

回答已采纳

发布于 2013-06-12 15:55:53

globalbuf变量是一个未初始化的静态变量,因此它的虚拟地址不是随机的。

我知道未初始化的全局变量和静态变量是BSS部分的一部分;因此,我假设BSS、文本和数据部分没有被ASLR随机化。

BSS部分不是随机的,因为它被标记为未初始化的数据。这是在可执行文件中的节头上设置的标志。本节中的数据是静态的,每次运行应用程序时都具有相同的地址。您看到的不变指针值是globalbuf变量的虚拟地址。

文本和数据部分是随机的(如果应用程序被编译为独立于-fPIE的位置),因为它们分别被标记为代码段(CS)和数据段(DS)。请注意,代码和数据段在x86中具有特殊意义,它们的基址被填充到CS和DS段寄存器中。这就是为什么在程序集中经常会看到像dword ptr ds:[05012340]dword ptr cs:[00410000]这样的引用-前者是数据段(DS)中的地址,后者是代码段(CS)中的地址。由于这些是重要的部分,它们的基址是随机的(即,与基址相等的偏移)。

票数 4
EN
页面原文内容由Security提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://security.stackexchange.com/questions/37373

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档