簡體   English   中英

.plt.plt.got 有什么不同?

[英].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

讀取 elf -l 結果

got.plt 消失了,02 段中的 is.plt.got 是什么?

我傾倒了兩個部分(plt,plt.got)並得到了這個程序集

.plt 是 plt 我了解到的:.plt 是我了解到的 plt

.plt.got,這是干什么用的?.plt.got ,這是為了什么

很抱歉傾銷不好,它是由

objcopy -O binary --only-section=.plt.got /bin/bash ./pltgot
objcopy -O binary --only-section=.plt /bin/bash ./plt

問題

  1. .plt 和.plt.got 有什么區別
  2. 為什么會發生這種差異?

查看您的問題的答案。 希望它可以幫助你。

  1. 不同之處在於.got.plt 是運行時可寫的,而.got 不是如果您啟用了針對稱為RELRO 的GOT 覆蓋攻擊的防御(重定位只讀)。 要啟用 RELRO,請使用 ld 選項 -z relro。 RELRO 將惰性綁定必須是運行時可寫的 GOT 條目放在.got.plt 中,所有其他條目放在 read-only.got 部分

  2. 作為 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM