Pwn专题(3)——安全机制ASLR和PIE
0x00 ASLR简介
ASLR就是地址空间布局随机化。在做pwn题目的时候很多攻击都需要知道程序的内存布局,开启ASLR能够有效的增加漏洞利用的难度,是一种针对缓冲区溢出的安全保护技术。
0x01 ASLR
使用下面的示例代码来查看当ASLR未开启、开启一部分、全部打开的时候heap、stack、libc的变化。
//gcc No_ASLR.c -no-pie -fno-pie -ldl
#include<stdio.h>
#include<stdlib.h>
#include<dlfcn.h>
int main()
{
int stack;
int *heap = malloc(sizeof(int));
void *handle = dlopen(“libc.so.6”,RTLD_NOW | RTLD_GLOBAL);printf(“executable: %p\n”,&main);
printf(“system@plt: %p\n”,&system);
printf(“heap: %p\n”,heap);
printf(“stack: %p\n”,&stack);
printf(“libc: %p\n”, handle);
free(heap);
return 0;
}
使用下面的命令来关闭地址随机化。
echo 0 > /proc/sys/kernel/randomize_va_space
0:关闭
1:随机化栈基地址(stack)、共享库(.so\libraries)、mmap 基地址
2:在1基础上,增加随机化堆基地址(chunk)
当关闭地址随机化的时候两次运行程序heap、stack、libc都没有变化。
当开启一部分地址随机化的时候两次运行程序stack、libc发生了变化。

当完全开启地址随机化的时候两次运行程序heap、stack、libc发生了变化。

0x02 PIE简介
PIE(Position-Independent-Executable),通常情况下,内核都在固定的地址运行,如果能改用位置无关,那攻击者就很难借助系统中的可执行代码实施攻击可以有效的阻止缓冲区溢出之类的攻击。
0x03 PIE
还是使用ASLR中使用的代码,但是这次编译的参数需要改变一下。
gcc -pie -fpie No_PIE.c -ldl
-fpie 为共享库生成位置无关代码
-pie 生成动态链接的位置无关可执行文件,通常需要同时指定-fpie
-ldl 加载动态链接库
完全开启ASLR。
echo 2 > /proc/sys/kernel/randomize_va_space
运行两次程序后发现程序本身、PLT、heap、stack、libc都发生了变化。
