使用 链接二进制文件时-Wl,-z,relro,-z,now
,所有重定位都在启动时执行,然后再将控制权传递给二进制文件。
因此,不需要该.got.plt
段。通常,指向链接器link_map
结构的指针存储在此段中。
当使用完整的 RELRO 编译时,如果在任何地方,可以在link_map
不咨询其他加载的库的情况下获得的副本,或者libdl
?
人们期望它出现的地方——在标有标签的部分DT_PLTGOT
——它没有出现。相反,只有一个返回类型为 Program Header 的链接PT_DYNAMIC
。标记的段中的槽以段DT_GOTPLT
的偏移量开始DYNAMIC
,并且不包含任何指向链接映射的指针。
标题
$ readelf -a amd64-pwntest-relro | egrep -i '(_dynamic|pltgot)'
0x0000000000000003 (PLTGOT) 0x202eb8
48: 0000000000202ca8 0 OBJECT LOCAL DEFAULT 21 _DYNAMIC
二进制是 RELRO
$ checksec.sh --file amd64-relro
RELRO STACK CANARY NX PIE RPATH RUNPATH FILE
Full RELRO No canary found NX disabled PIE enabled No RPATH No RUNPATH amd64-relro
GDB 显示指定偏移量处的数据在运行时不包含链接映射指针。
$ gdb ./amd64-relro
gdb-peda$ start
gdb-peda$ vmmap relro
Start End Perm Name
0x0000555555554000 0x0000555555556000 r-xp /home/user/pwntools-regression/src/amd64-relro
0x0000555555756000 0x0000555555757000 r-xp /home/user/pwntools-regression/src/amd64-relro
0x0000555555757000 0x0000555555758000 rwxp /home/user/pwntools-regression/src/amd64-relro
gdb-peda$ telescope 0x0000555555554000+0x202eb8 5
00:0000| 0x555555756eb8 --> 0x202ca8
01:0008| 0x555555756ec0 --> 0x0
02:0016| 0x555555756ec8 --> 0x0
03:0024| 0x555555756ed0 --> 0x7ffff7675870 (<__GI___libc_free>: mov rax,QWORD PTR [rip+0x33b671] # 0x7ffff79b0ee8)
04:0032| 0x555555756ed8 --> 0x7ffff79c0430 (<__pthread_create_2_1>: push rbp)