ASLR,PIE,PIC的相似处及区别

之前一直都以为ASLR和PIE是相同的东西,看了蒸米大佬的一步一步学rop和查看很多文章后,才意识到其中的区别的,记下笔记方便复习。只有把这几个机制弄清楚了,才能知道哪些地址是动的,哪些是不动的,写exp的时候才能写出通解。

百度百科关于ASLR(Address space layout randomization)的说法如下:

aslr是一种针对缓冲区溢出的安全保护技术,通过对堆、栈、共享库映射等线性区布局的随机化,通过增加攻击者预测目的地址的难度,防止攻击者直接定位攻击代码位置,达到阻止溢出攻击的目的的一种技术。

查看当前系统ASLR的打开情况:

cat /proc/sys/kernel/randomize_va_space

如果是0,代表ASLR关闭,
如果是1,是部分随机化,栈,共享库,vdso随机化。
如果是2,代表在1的基础上,堆也被随机化了。

开启ASLR后,每次启动程序,libc.so的基址就会发生变化:
在这里插入图片描述
将其值修改为2,然后查看动态库基址:
在这里插入图片描述

但是ASLR并不会随机化自身程序的代码段和数据段。
(图片来自蒸米大佬的一步一步学rop http://www.vuln.cn/6645
在这里插入图片描述
也就是说程序的加载还是从低地址0x08048000开始的。ASLR影响的只是堆,栈,和动态库的基址,并不会影响程序加载的基址
想要影响程序本身加载的基址,就需要开启PIE(position Independent executable ),开启PIE后,将本身程序也标记成为一种特殊的.so文件,所以依赖于ASLR的开启。简而言之就是开启PIE就必须开启ASLR。

PIC(position Independent code)就是位置无关代码,和动态库有关(有关静态链接和动态链接可以看《深入理解计算机系统》这本书)。
之前以为PIC开启后,每次启动程序后,动态库的基址本来就是变化,其实在不开ASLR的情况下,同一台机器上libc.so加载的基址是相同的,关机后再测试依然是相同的,不同机器上libc.so加载的基址才是不同的。
以同一台机器为例:
在这里插入图片描述
不同虚拟机为例:
在这里插入图片描述
在这里插入图片描述
动态库加载的基址都是不同的。(libc.so的版本都是相同的)

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章