之前学习了栈溢出常见的利用手法,有ret2text、ret2plt、ret2syscall、ret2shellcode、ret2libc、ret2csu
溢出栈迁移,这里接着学习一下常见的绕过pie
的手法
PIE
PIE(Position Independent Executables)是编译器gcc的一个功能选项fpie
,主要的功能是随机化了ELF装载的基地址,使用分页内存偏移定位到每一行指令,常见的表现形式是如果开启了PIE
保护,使用file或者readelf读取的文件类型会是LSB shared object
共享文件
这里需要注意一下,PIE
是对二进制程序做的地址随机化,而ASLR是系统层面的地址随机化,这两个放到一起,基本上是猜测不到程序的内存布局,这使得我们获取到的gadget
也是一个距离基地址的偏移,无法成功的执行。但是一般只有安全性较高的程序会使用,因为PIE相对来说比较影响程序的性能。
gcc编译时开启和关闭pie的选项:
-no-pie
: 关闭piefpie -pie
: 开启pie(默认选项)
开启了pie有一个很显著的区别,就是使用ida或者objdump分析的地址都是内存分页的偏移