[英].plt .plt.got what is different?
.plt
:在 RE 能段中,除 0 外,在plt[n]
处具有蹦床功能,在plt[0]
处具有.got.plt 解析器链接
.got
.got.plt
:在 RW 段中,只是地址
我从这篇文章中了解到: https://eli.thegreenplace.net/2011/11/03/position-independent-code-pic-in-shared-libraries/
实际的 Linux shell 命令给了我不同的答案
$readelf -l /bin/bash
我倾倒了两个部分(plt,plt.got)并得到了这个程序集
.plt 是 plt 我了解到的:
.plt.got,这是干什么用的?
很抱歉倾销不好,它是由
objcopy -O binary --only-section=.plt.got /bin/bash ./pltgot
objcopy -O binary --only-section=.plt /bin/bash ./plt
查看您的问题的答案。 希望它可以帮助你。
不同之处在于.got.plt 是运行时可写的,而.got 不是如果您启用了针对称为RELRO 的GOT 覆盖攻击的防御(重定位只读)。 要启用 RELRO,请使用 ld 选项 -z relro。 RELRO 将惰性绑定必须是运行时可写的 GOT 条目放在.got.plt 中,所有其他条目放在 read-only.got 部分
作为 ELF 通用标准文件格式的一部分,差异或这种设计已经存在:
ELF 二进制文件通常包含一个名为 .got.plt 的单独 GOT 部分,用于在惰性绑定过程中与 .plt 一起使用
Q1 参考第 45 页: Andriesse,Dennis。实用二进制分析:构建您自己的 Linux 工具,用于二进制检测、分析和反汇编。旧金山,No Starch Press,2019
Q2 参考第 45 页:同一本书,请参阅“惰性绑定和 PLT”部分
.plt
和.plt.got
的区别在于.plt
使用惰性绑定,而.plt.got
使用非惰性绑定。
当 function 的所有使用都是简单的 function 调用时,延迟绑定是可能的。 但是,如果需要 function 的地址,则必须使用非惰性绑定,因为绑定只能在调用 function 时发生,并且我们可能需要在第一次调用之前知道地址。 注意获取地址时直接访问GOT入口; 只有 function 通过.plt
和 .plt.got 调用.plt.got
。 如果使用-fno-plt
编译器选项,则不会发出.plt
和.plt.got
,并且 function 调用也直接访问 GOT 条目。
在以下示例中, objdump -d
用于反汇编,而readelf -r
用于列出重定位。
.plt
以 x64-64 为例, .plt
将包含以下条目:
0000000000014050 <_Unwind_Resume@plt>:
14050: ff 25 3a e6 0e 00 jmpq *0xee63a(%rip) # 102690 <_Unwind_Resume@GCC_3.0>
14056: 68 02 00 00 00 pushq $0x2
1405b: e9 c0 ff ff ff jmpq 14020 <.plt>
第一个jmpq
指向 GOT 条目,如果 GOT 条目尚未绑定,则第二个jmpq
执行延迟绑定。
.plt
相关 GOT 条目的重定位位于.rela.plt
部分并使用R_X86_64_JUMP_SLOT
,这让动态 linker 知道这些是惰性的。
0000000000102690 0000004600000007 R_X86_64_JUMP_SLOT 0000000000000000 _Unwind_Resume@GCC_3.0 + 0
.plt.got
.plt.got
包含只需要一个jmpq
的条目,因为它们不是惰性的:
0000000000014060 <memset@plt>:
14060: ff 25 5a ea 0e 00 jmpq *0xeea5a(%rip) # 102ac0 <memset@GLIBC_2.2.5>
14066: 66 90 xchg %ax,%ax
.plt.got
的相关 GOT 条目的重定位位于.rela.dyn
部分(连同 GOT 重定位的 rest),动态 linker 立即绑定:
0000000000102ac0 0000004b00000006 R_X86_64_GLOB_DAT 0000000000000000 memset@GLIBC_2.2.5 + 0
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.