ASLR 随机化 BSS

信息安全 威胁缓解 C aslr
2021-08-31 00:56:09

这是一些代码:

#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的实际地址?

1个回答

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

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

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

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