美文网首页
linux plt 的实现

linux plt 的实现

作者: dcharles | 来源:发表于2016-07-25 11:13 被阅读233次
Screenshot from 2016-07-25 15-42-57.png

以write函数为例说明延迟绑定,如上图所示,当第一次调用write函数时候,程序会跳转到.plt表处

Screenshot from 2016-07-25 15-43-31.png

程序首先会跳转到0x601018处,我们看一下0x601018是什么

Screenshot from 2016-07-25 15-44-32.png

0x601018是一个地址,这个地址就是jmp命令的下一条指令的地址。因为是第一次第一次调用,此时got还没有添加write函数的实际地址。当重定位完成之后就不会执行0x400586处的指令了。

Screenshot from 2016-07-25 15-46-18.png
我们继续调试,程序会跳转到0x400570处,这里首先会将0x601008(*(GOT+8)指向struct link_map的指针)地址的值压入堆栈,之前的0已经在堆栈中了。随后程序跳转到0x601010处。 Screenshot from 2016-07-25 15-49-01.png

0x601010处存放的是一个地址即7ffff7dee6a0,这个地址是dl_runtime_reslove函数的地址。

Screenshot from 2016-07-25 15-49-16.png

所以重定位最终是调用dl_runtime_reslove函数去解析write函数的实际地址,解析成功将地址保存到.got.plt表中。以后在调用write函数流程就变为plt->got。

dl_runtime_reslove函数确定符号的过程如下:


plt.png
_dl_runtime_resolve(link_map, rel_offset);

根据rel_offset,找到重定位条目:

Elf32_Rel * rel_entry = JMPREL + rel_offset;

根据rel_entry中的符号表条目编号,得到对应的符号信息:

Elf32_Sym *sym_entry = SYMTAB[ELF32_R_SYM(rel_entry->r_info)];

再找到符号信息中的符号名称:

char *sym_name = STRTAB + sym_entry->st_name;

获取符号对应的字符串仅仅是一小部分,具体的地址获取与link_map的实现息息相关,即压入堆栈的另一个参数,这一部分的原理与实现参考此文

相关文章

  • linux plt 的实现

    以write函数为例说明延迟绑定,如上图所示,当第一次调用write函数时候,程序会跳转到.plt表处 程序首先会...

  • linux上的延迟重定位

    linux pwn 前言 熟练地掌握linux的 链接与 绑定不仅仅是研究return to plt的必要,更是掌...

  • Matplotlib

    Matplotlib安装 MacOS Linux 基本用法 Module的导入: 画出一条直线: 使用plt.fi...

  • pwn6 介绍got plt以及libc.so

    GOT表和PLT表: GOT(Global Offset Table,全局偏移表)是Linux ELF文件中用于定...

  • 2018-02-24

    PLT的真正实现要更复杂些,ELF将GOT拆分成两个表“.got”和”.got.plt”,前者用来保存全局变量引用...

  • Python去白边保存图像

    import matplotlib.pyplot as plt fig = plt.gcf() plt.axis(...

  • matplotlib.pyplot使用方法

    导入包matplotlib.pyplot as plt 折线图:plt.plot() 散点图:plt.scatte...

  • 3.8 面积图、填图、饼图

    ''' 【课程3.8】 面积图、填图、饼图plt.plot.area()plt.fill(), plt.fill_...

  • 8-matplotlib面积图、填图、饼图

    面积图、填图、饼图 plt.plot.area()plt.fill(), plt.fill_between()pl...

  • 2020-05-28

    plt.subplot() plt.subplot(nrows, ncols, index, **kwargs) ...

网友评论

      本文标题:linux plt 的实现

      本文链接:https://www.haomeiwen.com/subject/sipgjttx.html