plt和got
最近在学习linux高级调试技术。下面就动态库连接这块做了一个实验
首先理解下plt是procedure linkage table,got是global offset table。got表中存放的是外部符号的地址。plt表中存放的是函数地址。下面看下实验具体情况。
源码:
#include <stdio.h>
int fun()
{
printf("hello world\n");
}
int main()
{
while(1){
fun();
}
return 1;
}
在fun函数开始处设置断点。开始运行程序
首先看下fun函数的反汇编代码:
首先看下fun函数的反汇编代码:
(gdb) disassemble fun
Dump of assembler code for function fun:
0x080483d4 <+0>: push %ebp
0x080483d5 <+1>: mov %esp,%ebp
0x080483d7 <+3>: sub $0x18,%esp
0x080483da <+6>: movl $0x80484d0,(%esp)
0x080483e1 <+13>: call 0x80482f0 <puts@plt>
0x080483e6 <+18>: leave
0x080483e7 <+19>: ret
End of assembler dump.
偏移量为13的那句汇编就是调用printf。这个可以通过objdump -l 和-S选项查看
查看0x80482f0处的汇编
(gdb) disassemble 0x80482f0
Dump of assembler code for function puts@plt:
0x080482f0 <+0>: jmp *0x804a000
0x080482f6 <+6>: push $0x0
0x080482fb <+11>: jmp 0x80482e0
End of assembler dump.
接着再查看0x804a000中存放的内容
gdb) x/x 0x804a000
0x804a000 <puts@got.plt>: 0x080482f6
可以看到就是之前的反汇编代码的下一句话,但这也是plt表中的一项
那么查看0x80482e0的反汇编,
(gdb) disassemble 0x80482e0
No function contains specified address.
那么在该地址处设置断点查看。发现还是不能查看,那么采用查看内存内容的方式查看该处反汇编代码
(gdb) x/10i 0x80482e0
0x80482e0: pushl 0x8049ff8
=> 0x80482e6: jmp *0x8049ffc
接着查看0x8049ffc里面的内容
(gdb) x/x 0x8049ffc
0x8049ffc <_GLOBAL_OFFSET_TABLE_+8>: 0xb7ff2690
发现这个got表中的一项,地址是0xb7ff2690。
接着查看0xb7ff2690地址处的反汇编代码
(gdb) x/10i 0xb7ff2690
0xb7ff2690: push %eax
0xb7ff2691: push %ecx
0xb7ff2692: push %edx
0xb7ff2693: mov 0x10(%esp),%edx
0xb7ff2697: mov 0xc(%esp),%eax
0xb7ff269b: call 0xb7fec1c0
接下来会调用0xb7fec1c0地址处的代码,查看map信息会发现,这两个地址全部都是0xb7fde820 - 0xb7ff6b9f is .text in /lib/ld-linux.so.2里的代码,但是这边由于条件限制,看不到里面的函数名称,在网上可以查到是_dl_runtime_resolve函数。
当第一次运行fun函数结束后,第二次运行该函数时,我们再看下反汇编代码。
(gdb) disassemble 0x80482f0
Dump of assembler code for function puts@plt:
0x080482f0 <+0>: jmp *0x804a000
0x080482f6 <+6>: push $0x0
0x080482fb <+11>: jmp 0x80482e0
这段代码没有改变,但是看下0x804a000中的地址
(gdb) x/x 0x804a000
0x804a000 <puts@got.plt>: 0xb7e866a0
这和之前的地址是不一样的,之前是跳转到了0x080482f6,而这里已经实际填写上了printf的地址。
总结一下就是,如果一个动态库函数是第一次被调用,那么plt表中是不存在该函数的地址的,通过ld库中的函数,将这个地址取出来存放到got表中,那么当第二次调用该函数时,plt表中就有了这个函数的地址,直接跳转到该地址,而不再需要去取地址,也就是动态链接。
plt和got的更多相关文章
- elf文件中的.plt .rel.dyn .rel.plt .got .got.plt的关系
.plt的作用是一个跳板,保存了某个符号在重定位表中的偏移量(用来第一次查找某个符号)和对应的.got.plt的对应的地址 .rel.dyn重定向表,在程序启动时就需要重定位完成. .rel.plt保 ...
- 动态链接库中函数的地址确定---PLT和GOT [转]
前面写过动态链接库 延迟绑定的一篇博文,那篇文章我非常喜欢,但是当时刚搞清楚,自己写的比较凌乱,我最近学习了Ulrich Drepper的How to write share library,学习了几 ...
- (原)python中使用plt.show()时显示图像
转载请注明出处: http://www.cnblogs.com/darkknightzh/p/6039667.html 参考网址: http://matplotlib.org/users/shell. ...
- 基于Android的ELF PLT/GOT符号和重定向过程ELF Hook实现(by 低端农业代码 2014.10.27)
介绍 技术原因写这篇文章,有两种: 一个是在大多数在线叙述性说明发现PLT/GOT第二十符号重定向过程定向x86的,例<Redirecting functions in shared ELF l ...
- [Q]将图纸转换为JPG、PNG、plt、DWF、DWFx,XPS等格式文件
如要将图纸打印为图片,请选择“PublishToWeb JPG.pc3”或“PublishToWeb PNG.pc3”打印机. 如要将图纸打印为plt格式文件,请选择“Windows Default ...
- PLT文件 和 DXF文件
PLT: CAM/CAD类似软件处理的图像文件的文件格式 DXF: AutoCAD(Drawing Interchange Format或者Drawing Exchange Format) 绘图交换文 ...
- 深入了解GOT,PLT和动态链接
之前几篇介绍exploit的文章, 有提到return-to-plt的技术. 当时只简单介绍了 GOT和PLT表的基本作用和他们之间的关系, 所以今天就来详细分析下其具体的工作过程. 本文所用的依然是 ...
- Linux Debugging(七): 使用反汇编理解动态库函数调用方式GOT/PLT
本文主要讲解动态库函数的地址是如何在运行时被定位的.首先介绍一下PIC和Relocatable的动态库的区别.然后讲解一下GOT和PLT的理论知识.GOT是Global Offset Table,是保 ...
- ELF 文件 动态连接 - 延迟绑定(PLT)
PLT 全称:Procedure Linkage Table ,直译:过程连接表 由于在动态连接中,程序的模块之间包含了大量的函数引用,所以在程序开始执行前,动态链接会耗费较多的时间用于模块之间函数引 ...
随机推荐
- Compiler Theory(编译原理)、词法/语法/AST/中间代码优化在Webshell检测上的应用
catalog . 引论 . 构建一个编译器的相关科学 . 程序设计语言基础 . 一个简单的语法制导翻译器 . 简单表达式的翻译器(源代码示例) . 词法分析 . 生成中间代码 . 词法分析器的实现 ...
- TCP/IP详解 笔记十四
TCP/IP协议(二) 连接的建立与终止 tcpdump -S输出TCP报文的格式 格式: 源>目的:标志 (标志就是tcp头部).标识首字符意义如下: 例如:telnet 某服务的输出(包括 ...
- 创建与合并分支-git入门教程
在版本回退里,你已经知道,每次提交,Git都把它们串成一条时间线,这条时间线就是一个分支.截止到目前,只有一条时间线,在Git里,这个分支叫主分支,即master分支.HEAD严格来说不是指向提交,而 ...
- Linux 下解压大全
.tar 解包:tar xvf FileName.tar 或 tar zxvf FilenName.tar打包:tar cvf FileName.tar DirName(注:tar是打包,不是压缩!) ...
- BZOJ1915: [Usaco2010 Open]奶牛的跳格子游戏
权限题,没有传送门. 这很显然是一道DP题,刚看完题目可能会比较懵逼.这道题如果不要求回去,那么就是一道很裸的DP题.但是本题要求回去而且回去的格子的前一个格必须是之前经过的. 先不考虑回去的路程,对 ...
- Ubuntu下忘记MySQL密码重设方法
今天在做Python的实验,要用到MySQL数据库,但是密码是啥捏~~~果断重新设置密码啦啦啦 http://www.cnblogs.com/yuxc/archive/2012/07/25/26075 ...
- uC/OS-II配置文件
/*************************************************************************************************** ...
- JavaScript学习笔记——事件
javascript事件基础和事件绑定 一.事件驱动 1.事件 javascript侦测到的用户的操作或是页面的一些行为(怎么发生的) 2.事件源 引发事件的元素.(发生在谁的身上)3.事件处理程序 ...
- C#--几个数据流Stream;StreamReader;StreamWriter;MemoryStream;BufferStream;
命名空间:System.IO; Stream: 各种流的基类,不能时行查找操作,Position属性不能修改.读取时不Position不会自动移动, HttpWebRequest webreq = ( ...
- linux远程登录(Telnet、SSH)
系统:RHEL 5.5 64位,使用CentOS的yum源并作更新处理 参考书目<Linux兵书>/电子工业出版社/刘丽霞,细节之处稍有变动. 一.Telnet(远程登录推荐SSH) 1. ...