What is ASLR?
Address space layout randomization (ASLR) is an exploit mitigation technique that randomizes
- Stack address.
- Heap address.
- Shared library address.
#echo 2 > /proc/sys/kernel/randomize_va_space
libc base address would get randomized.
NOTE: Only libc base address is randomized, offset of a particular function from its base address always remains constant!! Hence if we can bypass shared library base address randomization, vulnerable programs can be successfully exploited (using below three techniques) even when ASLR is turned on!!
What is return-to-plt?
In this technique instead of returning to a libc function (whose address is randomized), attacker returns to a function’s PLT (whose address is NOT randomized – its address is known prior to execution itself). Since ‘[email protected]’ is not randomized, attacker no more needs to predict libc base address instead he can simply return to ‘[email protected]’ inorder to invoke ‘function’.
What is PLT, how does invoking ‘[email protected]’ invokes ‘function’?
不像静态库一样,共享库的text段是被多个进程共享的,只有data段是每个进程独有的。这种设计减少了内存和磁盘的占用。由于text段是被多个进程共享的,所以text段就只有读和执行权限,因此动态链接器就不能在text段内重定位数据符号和函数地址。那动态链接器是怎样在不修改text段的前提下在运行时重定位共享库符号呢?,这是通过PIC实现的
PIC是什么?
PIC是为了这样一个事情而开发的--他保证了共享库text段被各个进程使用而不需要考虑加载时的重定向问题。PIC是通过一个间接的方式实现这一目标的--共享库的text段不包含一个绝对的虚拟地址,而是指向数据段的一个特定的表。这个表保存了全局符号和函数的绝对虚拟地址。动态链接器会在重定向的过程中填充这个表。这样的话在重定向的时候就只需要修改data段而不会影响text段
动态链接器在重定向全局符号和函数时用了以下两种方式
全局偏移表(GOT):全局偏移表对于每个全局变量都包含四个字节的条目,这四个字节包含了全局变量的地址。当代码段的指令引用全局变量时,并不是使用全局变量的绝对虚拟地址,而是指向GOT中的一个条目。这个GOT条目在共享库加载时会被动态链接器重定向。这样,PIC通过这个表间接的重定向了全局符号
过程连接表(PLT):PLT对于每个全局函数包含了一段桩代码。text段的函数调用并不是直接调用函数(function),而是调用了桩程序([email protected])。这段桩代码在动态链接器的帮助下解析函数的地址并将其复制到GOT中,这个解析过程只在第一次调用函数时发生,如果之后再次调用函数(调用桩代码),桩代码不会再解析函数地址,而是直接从GOT中获取函数地址,然后跳转过去。Thus PIC uses this table to relocate function addresses with two level of indirection.
这种技术需要程序使用了我们需要的函数才有[email protected]