一.   Linux下ASLR功能

1.   ASLR 技术介绍

ASLR 技术是一种针对缓冲区溢出的安全保护技术。

ASLR,全称为 Address  Space Layout Randomzation,地址空间布局随机化。ASLR 技术在 2005 年的 kernel 2.6.12 中被引入到 Linux 系统,它将进程的某些内存空间地址进行随机化来增大入侵者预测目的地址的难度,从而降低进程被成功入侵的风险。当前 Linux、Windows 等主流操作系统都已经采用该项技术。

ASLR功能等级:Linux系统中ASLR 技术分三个等级。如下:

  • 0:没有随机化。即关闭 ASLR。
  • 1:保留的随机化。共享库、栈、mmap() 以及 VDSO 将被随机化。
  • 2:完全的随机化。在 1 的基础上,通过 brk() 分配的内存空间也将被随机化。

2.  ASLR 功能关闭

ASLR 的等级可以通过一个内核参数  randomize_va_space  来进行控制。

可通过命令查看当前系统的 ASLR 等级,操作如下:

cat /proc/sys/kernel/randomize_va_space

系统默认这个功能是开启的。有时候调试代码时,需要更改 ASLR 功能,可通过命令设置。

如果想关闭该功能,则可以输入如下命令即可关闭,注意需要 root 权限,命令如下:

echo 0 > /proc/sys/kernel/randomize_va_space

确认是否成功关闭,可以通过命令查看,Linux 系统下操作如下:

二.  Linux编译选项 -no-pie

1.  PIE 技术介绍

PIE (position-independent executable) 是一种生成地址无关可执行程序的技术。如果编译器在生成可执行程序的过程中使用了PIE,那么当可执行程序被加载到内存中时其加载地址存在不可预知性。

2.  关闭 PIE 功能

有时需要调试代码,PIE 功能会影响到调试。需要关闭 PIE 功能。我这里系统是 ubuntu 系统。

编译程序需要加入  -no-pie 选项,对代码进行编译。-no-pie 选项是  gcc 编译器的编译选项之一。

关闭 PIE 功能时编译代码命令: gcc -no-pie test.c -o test

经过测试,ubuntu 20.04 默认 gcc 编译程序时是有 PIE 功能的。测试如下:

代码如下:

#include <stdio.h>
 
int g_data = 0;
 
void main()
{
    printf("g_data address = %x\n", &g_data);
}

当默认进行 gcc 编译时,即只输入 gcc main.c -o main.out 命令。可以看出全局变量的地址每次运行不固定。如下所示:

当关闭 PIE 功能编译程序时,即输入 gcc -no-pie main.c -o main.out 命令进行编译。则每次运行程序时,全局变量的地址固定不变,如下所示:

总结:

当代码中存在内存泄露,使用 mtrace 工具对代码进行排查时,经过测试验证:当在编译代码时加入 -no-pie 选项进行编译后, mtrace 工具才会定位到具体的某一行 C 代码行。

Logo

更多推荐