ELF文件格式解析二

使用objdump命令查看elf文件

objdump -x 查看elf文件所有头部的信息
ELF文件格式解析二_第1张图片
所有的elf文件。 程序头部(Program Header)中,都以 PT_PHDR和PT_INTERP先开始。这两个段必须在所有可加载段项目的前面。
从上图中的INTERP段中,可以看到改段从 0x318位置处开始加载,长度为0x1C。

我们使用 hexdump 命令查看elf文件的二进制内容。
ELF文件格式解析二_第2张图片
找到0x318位置
ELF文件格式解析二_第3张图片

6c2f 6269 3436 6c2f 2d64 696c 756e 2d78 3878 2d36 3436 732e 2e6f 0032
|/    bi  46    |/  - d   i |  un   -x   8 x  -6   4 6  s .  . o   2

通过比对ascii码,可以知道从0x318开始的28个二进制表示的
字符串是: /lib64/ld-linux-x86-64.so.2
ELF文件格式解析二_第4张图片

/usr/lib/x86_64-linux-gnu/libc-2.31.so 应该是/usr/lib/x86_64-linux-gnu/ld-2.31.so加载的。
ELF文件格式解析二_第5张图片

在这里插入图片描述

ELF文件格式解析二_第6张图片

ELF文件格式解析二_第7张图片

参考视频: elf文件格式

#include
#include

//#include "b.c"

int uninitiallized;
char* initialized = "I'm here";
int glb_arr[]={1,2,3,4};

int cmp(int a, int b){
	return a >= b ? a : b;
}

void main(){
	void * ptr = malloc(0x10);
	static int stc = 2;
	ptr = malloc(0x10);
	const int cst = 0xab;
	cmp(1,2);
	printf("end\n");
}

第一次调用到malloc函数时, 跳转到 malloc@plt, 然后跳转到malloc@got, 从got表得到偏移,从而跳转到偏移地址处,从而再去调用resolve函数获取malloc的绝对地址。

ELF文件格式解析二_第8张图片

got表中, 最开始指向都是偏移地址,如下 puts@glt指向的偏移是 0x555555555036.
malloc@got指向的偏移是 0x555555555036.
ELF文件格式解析二_第9张图片

调用resolve函数获取malloc的绝对地址,0x7ffff7e5e700. 并将该地址放到got表中。下次调用malloc直接用这个地址即可。不需要再次调用resolve函数获取地址。
puts@plt,malloc@plt都会调用resolve函数,因此,下图中的右上角的地址是一样的。

ELF文件格式解析二_第10张图片
ELF文件格式解析二_第11张图片

你可能感兴趣的:(linux)