assembly .plt . plt.got有何不同?

66bbxpm5  于 2022-12-13  发布在  Go
关注(0)|答案(2)|浏览(284)

.plt:在RE able段中,在plt[n](0除外)处具有蹦床功能,在plt[0]处具有.got.plt解析器链接
.got.got.plt:在可读写数据段中,仅寻址
我从这篇文章中学到:https://eli.thegreenplace.net/2011/11/03/position-independent-code-pic-in-shared-libraries/

问题

实际的Linux shell命令给出了不同的答案

$readelf -l /bin/bash

得到的.plt已消失,02段中的. www.example.com是什么plt.got?

我转储了两个部分(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

个问题

1..plt和. www.example.com之间的区别是什么plt.got
1.为什么会出现这种差异?

pw9qyyiw

pw9qyyiw1#

.plt.plt.got之间的区别在于.plt使用惰性绑定,而.plt.got使用非惰性绑定。
当一个函数的所有使用都是简单的函数调用时,惰性绑定是可能的。然而,如果任何事情都需要函数的地址,那么就必须使用非惰性绑定,因为绑定只能在函数被调用时发生,并且我们可能需要在第一次调用之前知道地址。注意,当获得地址时,GOT入口是直接访问的;只有函数调用通过.plt.plt.got。如果使用了-fno-plt编译器选项,则.plt.plt.got都不会发出,并且函数调用也直接访问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,这让动态链接器知道这些是惰性的。

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重定位),动态链接器会立即绑定:

0000000000102ac0  0000004b00000006 R_X86_64_GLOB_DAT      0000000000000000 memset@GLIBC_2.2.5 + 0
gdrx4gfi

gdrx4gfi2#

请参阅问题的答案。希望对您有所帮助。
1.不同的是.got.plt是运行时可写的,而.got不是,如果你启用了一个名为RELRO(relocations read-only,只读重定位)的GOT覆盖攻击防御机制。要启用RELRO,你可以使用ld选项-z relro。RELRO将必须是运行时可写的GOT条目放在.got.plt中,将所有其他条目放在read-only .got部分
1.这种设计的不同之处在于它是ELF通用标准文件格式的一部分:
ELF二进制文件通常包含一个名为. get.plt的单独GOT部分,以便在惰性绑定过程中与.plt一起使用

***Q1参考第45页:***Andriesse,Dennis.实用二进制分析:构建您自己的Linux工具,用于二进制指令插入、分析和反汇编。弗朗西斯科,No Starch Press,2019
第二季度参考第45页:同一本书,见“懒惰绑定和PLT”一节

相关问题