IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> C++知识库 -> 通过GDB学透PLT与GOT -> 正文阅读

[C++知识库]通过GDB学透PLT与GOT

前言

本文需要基础的ELF格式文件知识。

我们知道printf代码的实现位于libc.so中,而我们知道我们的so是在运行通过加载器进行加载的.

如下代码所示:

//编译指令 gcc -o main2.out main2.c -zlazy  
//zlazy是启用延迟绑定。部分发行版本连接器直接程序加载的时候会进行绑定so函数
#include <stdio.h>
void main(){
	printf("hello %d",23);
}

ldd命令可以查看程序所需的动态库
在这里插入图片描述

so编译的时候printf是不知道函数地址的,因为你不知道so中被加载到内存哪个地址。

如下图所示:
图[1]
图[1]

我们看到so被加载不同的地址对于调用函数指令也有所不同。

解决方案1

我们直接在程序被加载时重写改写所有so的函数调用地址。

比如如下汇编在编译时的指令

call xxx1
cal xxx2
call xxx3

加载后修改所有地址

call yyy1
cal yyy2
call yyy3

但是弊端异常明显,假设一个程序需要重定位100万个地址的话,那么程序启动会异常的慢,而且你程序不可能所有指令都会被调用(也许用户刚打开就关闭,你的代码基本没怎么执行却浪费大量的时间在加载时)。

解决方案2

延迟绑定重定位的地址,也就是我们在调用某条指令的时候再去修改他的调用地址。为了实现延迟绑定ELF推出了两个节 .GOTPLT.

首先我們要明白其中的一些格式

.got其实本质是一张表,每一项都是一个地址,也许是变量的地址或者函数的。某个需要重定位的函数被调用后.got表里的与之关联的地址会被改成真正函数地址(未被调用之前got的地址指向plt某个函数)。

.plt存储的是桩代码,负责解析与调用真正的重定位地址函数。

我们用一个例子举例说明:

我们原始调用某个函数的汇编指令:

call   xxxx #调用<printf>实际所在地址

启用延迟绑定后这个指令会改为调用plt某处代码

call   1050 #改为调用plt的某处代码

跳转处plt代码如下所示

 jmp QWORD PTR [rip+0x2fbd]        # rip+0x2fbd这个地址会指向.got某个存储地址

以下为.got表存储的地址信息为1034

;.got或者.got.plt表存储的地址
1034

1034这个地址指的又是.plt某个函数地址

1034      	push   0x0
1039   	    jmp 1020 <.plt>

push 用于传递参数 标识是哪个函数
jmp 跳转另一段plt代码

 1020	push   QWORD PTR [rip+0x2fe2]   # rip+0x2fe2计算为 4008 指向`.got.plt`表中的第二个地址
 1026  jmp QWORD PTR [rip+0x2fe3]        # [rip+0x2fe3 4010  指向`.got.plt`表中的第三个地址

其中 QWORD PTR [rip+0x2fe2] 传入的是link_map结构,内包含动态必要的信息,可以让我们查找函数


/* Structure describing a loaded shared object.  The `l_next' and `l_prev'
   members form a chain of all the shared objects loaded at startup.

   These data structures exist in space used by the run-time dynamic linker;
   modifying them may have disastrous results.  */

struct link_map
  {
    /* These first few members are part of the protocol with the debugger.
       This is the same format used in SVR4.  */

    ElfW(Addr) l_addr;		/* Difference between the address in the ELF
				   file and the addresses in memory.  */
    char *l_name;		/* Absolute file name object was found in.  */
    ElfW(Dyn) *l_ld;		/* Dynamic section of the shared object.  */
    struct link_map *l_next, *l_prev; /* Chain of loaded objects.  */
  };

QWORD PTR [rip+0x2fe3] 其实是一个名叫_dl_runtime_resolve函数,他的作用有两个

  1. 根据传入的函数id和link_map修改got表地址为函数地址
  2. 跳转查找的函数地址

为方便理解我们使用gdb调试进行演示:
如下代码:

//编译指令 gcc -o main2.out main2.c -zlazy  
//zlazy是启用延迟绑定。部分发行版本连接器直接程序加载的时候会进行绑定so函数
#include <stdio.h>
void main(){
	printf("hello %d",23);
}

首先gbd main2.out进入gdb调试界面
在这里插入图片描述
layout asm打开汇编面板
在这里插入图片描述
断点 函数入口b main
在这里插入图片描述
执行 r命令运行程序,然后单步到call 0x401040 <printf@plt>
在这里插入图片描述
输入si步入这条指令
在这里插入图片描述

QWORD PTR [rip+0x2fcd] 是got表中某一项的地址,也就是printf的地址,但是由于他没有重定向此时会指向另一个ptl函数地址

以下为此地址存储的数据:
在这里插入图片描述

对其反编译这个地址:
在这里插入图片描述
这个地址的代码其实是ptl.sec中的代码,这段代码最后又跳转0x401020

在这里插入图片描述

接着我们步入这个_dl_runtime_resolve函数
你最后会发现最步入到print函数的实现
在这里插入图片描述
我们最后在查看下我们前面的got表地址是否变化了
在这里插入图片描述

参考

1. GDB shows incorrect jump address at PLT section

通过 GDB 调试理解 GOT/PLT

got/plt之_dl_runtime_resolve

_dl_runtime_resolve

学习ret2dlresolve

  C++知识库 最新文章
【C++】友元、嵌套类、异常、RTTI、类型转换
通讯录的思路与实现(C语言)
C++PrimerPlus 第七章 函数-C++的编程模块(
Problem C: 算法9-9~9-12:平衡二叉树的基本
MSVC C++ UTF-8编程
C++进阶 多态原理
简单string类c++实现
我的年度总结
【C语言】以深厚地基筑伟岸高楼-基础篇(六
c语言常见错误合集
上一篇文章      下一篇文章      查看所有文章
加:2022-04-24 09:11:57  更:2022-04-24 09:12:11 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/23 21:08:20-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码