【问题标题】:What is <.got> section in ELF?什么是 ELF 中的 <.got> 部分?
【发布时间】:2018-08-28 15:45:15
【问题描述】:

据我所知,PLTGOT 是处理动态链接函数的部分。

如果代码调用 printf 这是 libc 的函数,
1.首先调用PLT获取printf的地址。
2. 并将此地址写入GOT 部分。
3. 从第二次调用开始,代码使用GOT 中编写的函数。

当我仔细研究 ELF 二进制文件时,
- 我在 ELF 中发现 PLT 部分的名称是 &lt;.plt&gt;
- 在 ELF 中,GOT 部分的名称是 &lt;.got.plt&gt;

但是……ELF 中也有 &lt;.got&gt; 部分。
我无法理解这部分是如何使用的。



问。 &lt;.got&gt; 部分的用途是什么?
&lt;.got&gt;&lt;.got.plt&gt; 部分有什么区别?



PS 1. 这个 &lt;.got&gt; 部分非常小,(在我的示例二进制文件中它只包含 4 个字节。)
这里我附上 &lt;.got&gt; 部分的 IDA 视图:

.got:08049FFC ; ===========================================================================
.got:08049FFC
.got:08049FFC ; Segment type: Pure data
.got:08049FFC ; Segment permissions: Read/Write
.got:08049FFC _got            segment dword public 'DATA' use32
.got:08049FFC                 assume cs:_got
.got:08049FFC                 ;org 8049FFCh
.got:08049FFC __gmon_start___ptr dd offset __imp___gmon_start__
.got:08049FFC                                         ; DATA XREF: _init_proc+F↑r
.got:08049FFC                                         ; __gmon_start__↑r
.got:08049FFC _got            ends
.got:08049FFC


PS2。我也查了here,但答案不足以让我理解<.got>部分的用法。

【问题讨论】:

标签: x86 binary elf bin got


【解决方案1】:

Got.plt 实际上是 .got 部分的较小子集。想想指向一组插槽的尾部。从概念上讲,它看起来像这样

int[10] 得到; int* gotplt=&got[5]

Got 部分基本上可以包含全局变量和函数的地址。所有全局变量都在前几个槽中,后缀都是指向函数的指针。 gotplt 是第一个仅包含函数地址的插槽 .got..

最终在函数地址通过 plt.解析的地址进入 .gotplt,顺便说一句,正如我之前提到的,它在 .got 中。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-04-29
    • 1970-01-01
    • 2012-05-15
    • 1970-01-01
    • 2012-07-25
    • 2020-06-07
    • 2021-01-08
    • 2011-01-15
    相关资源
    最近更新 更多