pwn知识点2 ASLR,PIE和PIC的异同
正文
ASLR
ASLR介绍
进程地址空间各区域随机化,ASLR(Address Space Layout Randomization)。
这是系统级的设置,可以在系统层面全部调整。
- 为了提升系统的安全,增大漏洞的攻击难度,提出了,称之为ASLR(Address Space Layout Randomization)。
- ASLR通过随机放置进程关键数据区域的地址空间来防止攻击者能可靠地跳转到内存的特定位置来利用函数。
- 它是在程序运行时系统进行的操作,因而只能随机化stack、heap、libraries的基址。
- 现代操作系统一般都加设这一机制,以防范恶意程序对已知地址进行Return-to-libc攻击。
PIE类型/级别(ASLR保护参数值)
1 | 0: ASLR 关闭 |
来自博客(csdn)
Linux系统设置ASLR
- ASLR存储在
/proc/sys/kernel/randomize_va_space
注意:下面echo 0也可以换成echo 1或者echo 2。
Root用户:1
echo 0 > /proc/sys/kernel/randomize_va_space
- 注意:非root用户如下设置会报错。因为这样写系统会认为是sudo 命令重定向,而sudo命令不支持重定向。
1
2sudo echo 0 > /proc/sys/kernel/randomize_va_space
bash: /proc/sys/kernel/randomize_va_space: Permission denied
正确写法:1
sudo sh -c "echo 0 > /proc/sys/kernel/randomize_va_space"
特性
ASLR只是针对于地址中间位进行随机,最低的 12 位并不会发生改变。
所以我们可以获取任意的libc库函数的真实地址来确定libc的版本和libc基址,来推得其他敏感libc函数的地址。
这就是LibcSearcher的原理。
PIE和PIC
PIE是什么?
还是来自刚才的来自博客(csdn)。
PIE 是 gcc 编译器的功能选项,作用于程序(ELF)编译过程中。是一个针对代码段( .text )、数据段( .data )、未初始化全局变量段( .bss )等固定地址的一个防护技术。
如果程序开启了PIE保护的话,在每次加载程序时都变换加载地址,从而不能通过 ROPgadget 等一些工具来帮助解题。
特点
程序每一次加载都变换基地址,但是不改变指令间的相对地址。
PIE与PIC的区别是什么?
另一个博客(cnblogs)的定义:
- PIE(Position Independent Executables)是编译器(gcc,..)功能选项(-fPIE),作用于excutable编译过程,可将其理解为特殊的PIC(so专用,Position Independent Code),加了PIE选项编译出来的ELF用file命令查看会显示其为so,其随机化了ELF装载内存的基址(代码段、plt、got、data等共同的基址)。
也就是说,PIC还可以用于编译动态库(.so等),但PIE只能用于编译ELF。
gcc编译时关于PIE和PIC的控制
我没看懂怎么对PIE进行编译控制,这里引用后者博客的内容。1
2
3
4
5gcc -o test test.c // 默认情况下看系统,一般是开到2
gcc -fpie -pie -o test test.c // 开启PIE,此时强度为1
gcc -fPIE -pie -o test test.c // 开启PIE,此时为最高强度2
gcc -fpic -o test test.c // 开启PIC,此时强度为1,不会开启PIE
gcc -fPIC -o test test.c // 开启PIC,此时为最高强度2,不会开启PIE
最后,ASLR和PIE、PIE的异同点总结
- 异同点:
- 同:他们都代表着地址随机化的技术。
- 异:他们层次不同,一个是系统层次的功能,另两个是编译器给出的选项,技术细节也可能有所不同。
- 他们能同时开吗?当然可以,也就是(ASLR+PIE/ASLR+PIC)这样子的。
- 原先ASLR早于PIE出现,有return-to-plt、got hijack、stack-pivot(bypass stack ransomize)等绕过ASLR的技术,而在ASLR+PIE之后,这些bypass技术就都失效了,只能借助其他的信息泄露漏洞泄露基址(常用libc基址)。
