按照链接器的约定, 32位程序会加载到0x08048000这个地址中(为什么?), 所以我们写程序时, 可以以这个地址为基础, 对变量进行绝对地址寻址. 以main为例:
$ readelf -S ....用gdb(在启动程序之前)可看到该地址正是var变量的地址, 且初始值为10:
$ gdb ....至于为什么要这么绕, 后面会说明具体原因.
这是链接器在执行链接时实际上要填充的部分, 保存了所有外部符号的地址信息....不过前提是要知道libc.so在运行时的加载地址. 如果没启用ASLR, 这个地址是固定的....所以如果没有启用位置无关代码的话, 即使启用了ASLR, 我们还是可以通过PLT来跳转到libc 中的函数执行, 这种攻击方法就叫ret2plt.