马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有账号?立即注册
×
什么是ELF文件?
英文全称就是Executable Linkable Format,即可实行可链接格式,Linux体系上所运行的就是ELF格式的文件,相干定义在“/usr/include/elf.h”文件里。
1. 编写示例代码
这里我们编写下面的示例代码,用来编译天生ELF文件
- #include <stdio.h>
- int global_init_var = 10;
- int global_uninit_var;
- void func(int sum) {
- printf("%d\n",sum);
- }
- void main(void) {
- static int local_static_init_var = 20;
- static int local_static_uninit_var;
- int local_init_val = 30;
- int local_uninit_var;
- func(global_init_var + local_init_val + local_static_init_var);
- }
复制代码 稍微解释一下上述代码,就是分别在全局创建可变变量,main函数内部创建静态变量和可变变量,然后在main函数内对变量举行相加并输出。
接下来分别使用以下命令对示例代码举行编译:
- gcc elfDemo.c -o elfDemo.exec //生成动态可执行文件
- gcc -static elfDemo.c -o elfDemo_static.exec //生成静态可执行文件
- gcc -c elfDemo.c -o elfDemo.rel //生成可重定位文件
- gcc -c -fPIC elfDemo.c -o elfDemo_pic.rel && gcc -shared elfDemo_pic.rel -o elfDemo.dyn //生成动态链接库文件(共享目标文件)
复制代码 分别解释一下上述gcc参数的作用:
-static:天生静态可实行文件,使用静态链接;
-c:编译、汇编指定的源文件,但是不举行链接;
-fPIC:产生位置无关码(position independent code) ;
-shared:天生共享库(动态链接库);
让我们使用file命令来看看天生的究竟是什么妖孽
- ➜ file elfDemo.exec
- elfDemo.exec: ELF 64-bit LSB pie executable, x86-64, version 1 (SYSV), dynamically linked, interpreter /lib64/ld-linux-x86-64.so.2, BuildID[sha1]=3f9dc99d717e41298f465ac3be2db2775aede666, for GNU/Linux 3.2.0, not stripped
复制代码 dynamically linked说明第一个文件属于动态可链接文件
- ➜ file elfDemo_static.exec
- elfDemo_static.exec: ELF 64-bit LSB executable, x86-64, version 1 (GNU/Linux), statically linked, BuildID[sha1]=af7a8c76ceca3b151e669aabb38f753002d4a394, for GNU/Linux 3.2.0, not stripped
复制代码 statically linked说明第二个文件属于静态可链接文件
- ➜ file elfDemo.rel
- elfDemo.rel: ELF 64-bit LSB relocatable, x86-64, version 1 (SYSV), not stripped
复制代码 relocaltable说明第三个文件属于可重定位文件
- ➜ file elfDemo.dyn
- elfDemo.dyn: ELF 64-bit LSB shared object, x86-64, version 1 (SYSV), dynamically linked, BuildID[sha1]=d43a76d4eeb0d10e1d7fe26e929ae8e669f87346, not stripped
复制代码 shared object说明第四个文件属于可共享文件
通过上述案例我们可以发现ELF文件可以分为三种类型:可实行文件(.exec)、可重定位文件(.rel)和共享目的文件(.dyn)
- 可实行文件:经过链接的、可实行的目的文件,通常也被称为步伐;
- 可重定位文件:由源文件编译而成且尚未链接的目的文件,通常以“.o”作为扩展名。用于与其他目的文件举行链接以构成可实行文件或动态链接库,通常是一段位置独立的代码;
- 共享目的文件:动态链接库文件。用于在链接过程中与其他动态链接库或可重定位文件一起构建新的目的文件,或者在可实行文件加载时,链接到进程中作为运行代码的一部分。
2. ELF文件布局
我们讨论ELF文件布局通常有两个差别的视角:链接视角,即用户视角,通过节(Section)来举行划分ELF文件;另一种是运行视角,即操作体系的视角,通过段(Segment)来举行划分。信赖各人在学习计算机组成原理的时候也有了解过这两个概念。
在网上找来了一张图,可以更直观的看出来两种视角的布局
2.1 ELF文件总体布局
在举行PWN时,我们通常是以用户的视角来找到二进制漏洞的,因此我们先学习链接视角下ELF的文件布局
|