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文件了

elf文件--基于《ctf竞赛权威指南pwn篇》的更多相关文章

  1. 基于《Hadoop权威指南 第三版》在Windows搭建Hadoop环境及运行第一个例子

    在Windows环境上搭建Hadoop环境需要安装jdk1.7或以上版本.有了jdk之后,就可以进行Hadoop的搭建. 首先下载所需要的包: 1. Hadoop包: hadoop-2.5.2.tar ...

  2. WebService《JavaEE6权威指南 基础篇第4版》

    [Web服务] 为运行在不同平台和框架之上的软件提供了互操作的标准方式.良好的互操作性和可扩展性.消息采用自包含文档的形式. ——解决异构系统之间交互.解决异构系统通信问题:  1.通过XML,JSO ...

  3. 基于python的《Hadoop权威指南》一书中气象数据下载和map reduce化数据处理及其可视化

    文档内容: 1:下载<hadoop权威指南>中的气象数据 2:对下载的气象数据归档整理并读取数据 3:对气象数据进行map reduce进行处理 关键词:<Hadoop权威指南> ...

  4. Hadoop权威指南:HDFS-目录,查询文件系统,删除文件

    Hadoop权威指南:HDFS-目录,查询文件系统,删除文件 [TOC] 目录 FileSystem实例提供了创建目录的方法 public boolean mkdirs(Path f) throws ...

  5. maven权威指南学习笔记(一)——简介

    maven是什么?有什么用? Maven是一个项目管理工具,它包含了     一个项目对象模型 (Project Object Model),     一组标准集合,     一个项目生命周期(Pro ...

  6. Netty权威指南

    Netty权威指南(异步非阻塞通信领域的经典之作,国内首本深入剖析Netty的著作,全面系统讲解原理.实战和源码,带你完美进阶Netty工程师.) 李林锋 著   ISBN 978-7-121-233 ...

  7. Android开发权威指南(第2版)新书发布

    <Android 开发权威指南(第二版)>是畅销书<Android开发权威指南>的升级版,内容更新超过80%,是一本全面介绍Android应用开发的专著,拥有45 章精彩内容供 ...

  8. Visual C++2010开发权威指南 中文高清PDF - VC.NET

    第一部分  Visual C++ 2010开发与新特性第1章  Visual C++ 2010开发环境简介 11.1  Visual C++ 2010简介 11.2  Visual C++ 2010下 ...

  9. Struts2权威指南笔记

    Struts2权威指南笔记 1.mvc特点包括: ① 多个视图可以对应一个模型 ② 模型返回的数据与显示逻辑分离 ③ 应用层被分隔为三层,降低了各层之间的耦合,提供了应用的可扩展性 ④ 控制层的概念也 ...

随机推荐

  1. 学习Tomcat(一)之容器概览

    Tomcat是Apache软件基金会的一个顶级项目,由Apache.Sun和其它一些公司及个人共同开发,是目前比较流行的Web服务器之一.Tomcat是一个开源的.小型的轻量级应用服务器,具有占用系统 ...

  2. call、apply、bind三者比较

    var obj={a:1}; var foo={ getA:function(item1,item2){ return this.a+item1+item2 } } // apply绑定参数为数组,一 ...

  3. Redis核心原理与实践--列表实现原理之ziplist

    列表类型可以存储一组按插入顺序排序的字符串,它非常灵活,支持在两端插入.弹出数据,可以充当栈和队列的角色. > LPUSH fruit apple (integer) 1 > RPUSH ...

  4. c++ 游戏代码(1)

    迷宫代码如下: #include <iostream> #include <windows.h> #include <conio.h> using namespac ...

  5. Linux系列(41) - 监听命令Vmstart,Top(还需完善)

    一.简介 vmstat是Virtual Meomory Statistics(虚拟内存统计)的缩写,可对操作系统的虚拟内存.进程.CPU活动进行监控:属于sysstat包:它是对系统的整体情况进行统计 ...

  6. windom 下面redis安装和扩展安装

    参考 https://www.cnblogs.com/yulongcode/p/10585229.html https://blog.csdn.net/qq_41921511/article/deta ...

  7. ci框架 自定义配置方法

    系统自动在Application文件夹下生成的config.php文件,采用key-value关联数组的形式来存放配置项和值.为了使结构更清晰,手动新建另外一个配置文件myconfig.php,所采用 ...

  8. whistle安装

    可参考官方帮助文档:https://wproxy.org/whistle/install.html 系统:windows10   jdk:1.8.0_171    node:10.16.0    np ...

  9. pyqt5实现窗口跳转并关闭上一个窗口

    关键在于要定义一个关闭窗体的函数colsewin() 然后将按键与该函数连接(connect)在一起即可 import sys from PyQt5.QtWidgets import QMainWin ...

  10. 疏忽Bug

    仅供自己留存备份   错误: vector不是模板 解决: 头文件未包含 头文件: #include <vector> using namespace std;     错误: 多字节字符 ...