最后再说一下ASLR,该技术虽然不是由 GCC 编译时提供的,但对 PIE 还是有影响。就是将程序的内存布局随机化,让攻击者不能得到数据区的地址来构造 payload。程序的堆栈分配与共享库的装载都是在运行时进行,系统在程序每次执行时,随机地分配程序堆栈的地址以及共享库装载的地址。使攻击者无法预测自己写入的数据区的虚拟地址。
针对这个保护机制的攻击,一般是通过信息泄漏来实现。同一模块中的所有代码和数据的相对偏移是固定的,泄漏出某个模块中的任一代码指针或数据指针,就可通过计算得到此模块中任意代码或数据的地址。