elf文件--基于《ctf竞赛权威指南pwn篇》

1.ELF概念:

ELF(Executable and Linkable Format),即“可执行可链接格式”,最初由UNIX系统实验室作为应用程序二进制接口(Application Binary Interface – ABI)的一部分而制定和发布,是COFF(Common file format)格式的变种。Linux系统上所运行的就是ELF格式的文件,相关定义在“/usr/include/elf.h”文件里。


它和在Windows下pe文件是相对的。

在这里插入图片描述
在这里插入图片描述
可以看到ELF文件非常的多,我没有细细的看。

2.ELF文件的几种类型:

ELF文件分为三种类型,可执行文件(.exec)、可重定位文件(.rel)和共享目标文件(.dyn):
  1. 可执行文件(executable file):经过链接的、可执行的目标文件,通常也被称为程序。
  2. 可重定位文件(relocatable file):由源文件编译而成且尚未链接的目标文件,通常以“.o”作为扩展名。用于与其他目标文件进行链接以构成可执行文件或动态链接库,通常是一段位置独立的代码(Position Independent Code, PIC)。
    对于.o结尾的文件,在编译的时候可以link到我们的程序中去
  3. 共享目标文件(shared object file):动态链接库文件。用于在链接过程中与其他动态链接库或可重定位文件一起构建新的目标文件,或者在可执行文件加载时,链接到进程中作为运行代码的一部分。

3.ELF文件的结构

在ELF文件格式规范中,ELF文件被统称为object file,这与我们通常理解的.o文件是不太一样的。

  • 在审视一个目标文件时,有两种视角可供选择,一种是链接视角,通过节(Section)来进行划分;另一种是运行视角,通过段(Segment)来进行划分
  • 在这里插入图片描述

下面我们先从链接视角去来看看:
在这里插入图片描述

(这是简化版的elf文件头)
我们可以看见代码段(.text)和数据段(.data)是分开处理的,这一点就是从安全的角度去出发考虑的。
下面我们自上而下的介绍链接视角去看的elf文件.


首先我们写一个简单的helloworld程序,然后使用gcc编译器将编译过程中的中间文件给生成出来。
在这里插入图片描述

在这里插入图片描述

在这里插入图片描述
我们额可以通过gcc生成几个不同main可执行文件过程中的几个中间文件查看elf文件readelf -h main


在这里插入图片描述
我们可以看见这个第一条就是一个magic,这个是个什么意思呢??这个美其名曰魔术字符(7f 45 4c 46),当文件被映射到内存中的时候,通过寻找这
个字符可以确定映射的地址。

这里我们给出ELF64_Ehdr结构体的代码:
在这里插入图片描述
看完了elf_hander下面我们就来看看section节:

  • 一个目标文件包含了许多的节,这些节的信息保持在节头表中(section header table)中,表的每一项都是ELF64_Shdr的结构体(注意与之前的ELF64_Ehdr区别)

查看节表头

读取节头表 readelf -S main.o
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
至于另外的两个.data和.bss段我不想看了,因为腿这会麻了。


这是一些其他节的东西,我看着书上面写出来的我复制一些吧,也算自己记忆。

在这里插入图片描述
字符串表(shstrtab和strtab)中包含了以null结尾的字符序列,用来表示符号名和节名,引用字符串时只需给出字符序列在表中的偏移即可。字符串表的第一个字符和最后一个字符都是null字符,以确保所有字符串的开始和终止。
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述


  • 符号表(.dynsym和.symtab)记录了目标文件中所用到的所有符号信息,通常分为.dynsym和.symtab,前者是后者的子集。.dynsym保存了引用自外部文件的符号,只能在运行时被解析,而.symtab还保存了本地符号,用于调试和链接。目标文件通过一个符号在表中的索引值来使用该符号。索引值从0开始计数,但值为0的表项不具有实际的意义,它表示未定义的符号。每个符号都有一个符号值(symbol value),对于变量和函数,该值就是符号的地址。

在这里插入图片描述
num就是索引值。

  • 接下来我们看的是重定位
    重定位是连接符号定义与符号引用的过程。可重定位文件在构建可执行文件或共享目标文件时,需要把节中的符号引用换成这些符号在进程空间中的虚拟地址。

在这里插入图片描述
这里offset是在重定位时候需要被修改的符号偏移,info分为两个部分:type知识如何修改引用,symbol指示应该修改引用为那个符号,addend表示对于被修改符号的引用做偏移调整。


以上呢就是在link视角下去看elf文件了

posted @ 2021-10-21 20:36  写不完作业还要玩  阅读(524)  评论(0编辑  收藏  举报