暗无天日

=============>DarkSun的个人博客

如何禁止地址空间布局随机化对调试带来的影响

从 《Effective Debugging》中学来的,记录一下。

现代linux内核每次加载程序时会将程序加载到内存的随机位置,以防止缓冲区益处的代码注入攻击。

比如下面程序可以输出自身的栈、堆、代码及数据相关的内存地址:

#include <stdio.h>
#include <stdlib.h>

int z;
int i=1;
const int c=1;

int main(int argc, char *argv[])
{
  printf("Stack:\t%p\n", (void*)&argc);
  printf("heap:\t%p\n", (void*) malloc(1));
  printf("code:\t%p\n", (void*) main);
  printf("data:\t%p (zero)\n", (void*) &z);
  printf("data:\t%p (initialized)\n", (void*) &i);
  printf("data:\t%p (constant)\n", (void*) &c);
  return 0;
}

第一次执行结果:

Stack:  0x7ffde6f8cf9c
heap:   0x55ca3fd9d270
code:   0x55ca3ee95149
data:   0x55ca3ee98040 (zero)
data:   0x55ca3ee98038 (initialized)
data:   0x55ca3ee96004 (constant)

第二次执行结果:

Stack:  0x7ffebd2eb6ec
heap:   0x55a72ae36270
code:   0x55a72ae04149
data:   0x55a72ae07040 (zero)
data:   0x55a72ae07038 (initialized)
data:   0x55a72ae05004 (constant)

然而这种地址空间布局随机化措施(address space layout randomization, ASLR)可能干扰调试工作,比如会使我们记录下来的指针指变得无效。

要禁止ASLR,可以采用下面方法来运行程序

setarch $(uname -m) -R myprogram
# 这里 -R 表示 --addr-no-randomize
              # Disables randomization of the virtual address space.  Turns on ADDR_NO_RANDOMIZE.