实践四之实验报告

一、概述

1.ELF全称Executable and Linkable Format,可执行连接格式,ELF格式的文件用于存储Linux程序。ELF文件(目标文件)格式主要三种:

  • 可重定向文件:文件保存着代码和适当的数据,用来和其他的目标文件一起来创建一个可执行文件或者是一个共享目标文件。(目标文件或者静态库文件,即linux通常后缀为.a和.o的文件)
  • 可执行文件:文件保存着一个用来执行的程序。(例如bash,gcc等)
  • 共享目标文件:共享库。文件保存着代码和合适的数据,用来被下连接编辑器和动态链接器链接。(linux下后缀为.so的文件。)
    目标文件既要参与程序链接又要参与程序执行:

一般的 ELF 文件包括三个索引表:ELF header,Program header table,Section header table。

  • ELF header:在文件的开始,保存了路线图,描述了该文件的组织情况。
  • Program header table:告诉系统如何创建进程映像。用来构造进程映像的目标文件必须具有程序头部表,可重定位文件不需要这个表。
  • Section header table:包含了描述文件节区的信息,每个节区在表中都有一项,每一项给出诸如节区名称、节区大小这类信息。用于链接的目标文件必须包含节区头部表,其他目标文件可以有,也可以没有这个表。

二、分析ELF文件头(ELF header)

  • 进入终端输入:cd /usr/include 进入include文件夹后查看elf.h文件,查看ELF的文件头包含整个文件的控制结构
  • 写一个小程序(hello 20135211)进行编译,生成hello可执行文件。
    使用‘readelf –a hello’命令,都得到下面的ELF Header头文件的信息,如下图:
  • 通过上图信息,可以得出Elf Header的Size为64bytes,所以可以使用hexdump工具将头文件的16进制表打开。
    如下图使用:‘hexdump –x hello –n 64’命令来查看hello文件头的16进制表(前64bytes)对格式进行分析。
  • 第一行,对应e_ident[EI_NIDENT]。实际表示内容为7f454c46020101000000000000000000,前四个字节7f454c46(0x45,0x4c,0x46是‘e‘,‘l‘,‘f‘对应的ascii编码)是一个魔数,表示这是一个ELF对象。接下来的一个字节02表示是一个64位对象,接下来的一个字节01表示是小端法表示,再接下来的一个字节01表示文件头版本。剩下的默认都设置为0.
  • 第二行,e_type值为0x0002,表示是一个可执行文件。e_machine值为0x003e,表示是Advanced Micro Devices X86-64处理器体系结构。e_version值为0x00000100,表示是当前版本。e_entry值为0x 004003f0,表示入口点。
  • 第三行,e_phoff值为0x40,表示程序头表。e_shoff值为0x1278,表示段表的偏移地址。
  • 第四行,e_flags值为0x00000000,表示未知处理器特定标志。e_ehsize值为0x0040,表示elf文件头大小(正好是64bytes)。e_phentsize表示一个program header表中的入口的长度,值为0x0038。e_phnum的值为0x0008,给出program header表中的入口数目。e_shentsize值为0x0040表示段头大小为64个字节。e_shnum值为0x001f,表示段表入口有31个。e_shstrndx值为0x001c,表示段名串表的在段表中的索引号。

三、通过文件头找到section header table,理解其内容

  • file elf1显示生成的目标文件hello的类型
  • elf1是一个可执行文件。输入:ls –l hello查看hello的大小:
  • 如图可知,hello大小为6712字节。
    输入:hexdump –x hello来用16进制的数字来显示hello的内容
    (其中,第二列是16进制表示的偏移地址)
  • 输入:objdump –x hello来显示hello中各个段以及符号表的相关信息:
  • 输入:readelf –a hello来查看各个段信息:
  • ELF文件头信息:
  • 段表Section header table:
  • 符号表 Symbol table:

四、通过section header table找到各section

在一个ELF文件中有一个section header table,通过它我们可以定位到所有的 section,而 ELF header 中的e_shoff 变量就是保存 section header table 入口对文件头的偏移量。而每个 section 都会对应一个 section header ,所以只要在 section header table 中找到每个 section header,就可以通过 section header 找到你想要的 section。

下面以可执行文件hello为例,以保存代码段的 section 为例来讲解读取某个section 的过程。
使用‘vi /usr/include/elf.h ’命令查看Sections Header的结构体:

由上面分析可知,section headers table中的每一个section header所占的size均为64字节,ELF header得到了e_shoff变量的值为0X1278,也就是table入口的偏移量,通过看e_shnum值为0x001f,表示段表入口有31个。
所以从0x00001278开始有31个段,每个段占64个字节大小,输入 hexdump elf1查看:

  • 第一个段,其中内容全部为0,所以不表示任何段。
  • 第二个段,为.interp段,段偏移sh_offset为0X200,段大小sh_size为0X1c。
  • 第三个段,为.note.ABI-tag段,段偏移sh_offset为0X21c,段大小sh_size为0X 20。
  • 第四个段,为.note.gnu.build-i段,段偏移sh_offset为0X 23c,段大小sh_size为0X 24。
  • 第五个段,为.gnu.hash段,段偏移sh_offset为0X 260,段大小sh_size为0X 1c。

…………

  • 第十四个段,为.text段, 段偏移sh_offset为0X 3f0, 段大小sh_size为0X 182。
  • 第二十五个段,为.data段, 段偏移sh_offset为0X 8d8, 段大小sh_size为0X 10。
  • 第二十六个段,为.bss段, 段偏移sh_offset为0X 8e8(红线),段大小sh_size为0X 08。
  • 第二十九个段, 为.symtab段,段偏移sh_offset为0X910,段大小sh_size为0X0648。
  • 第三十个段, 为.strtab段,段偏移sh_offset为0Xf58,段大小sh_size为0X214.

我们用readelf 命令去查看.text这个 section 中的内容,
输入readelf –x 14 hello,(.text前面的标号为14)对14索引号的.text的section的内容进行查看:

下面用 hexdump 的方法去读取.text这个 section 中的内容,通过看section header中.text中offset和size分别是0x3f0和0x182,通过16进制向10进制转换得到offset:1008和size:386。
输入 hexdump –s 1008 –n 386 –C hello

得到了和上面的readelf得到的相同。
使用下面命令对hello的文本段(.text)进行反汇编:
objdump –d hello 得到如下图:

可以看出,使用反汇编的16进制数据和前面查找到的是相同的。

五、理解常见.text .strtab .symtab .rodata等section

①.text section是可执行指令的集合,.data和.text都是属于PROGBITS类型的section,这是将来要运行的程序与代码。查询段表可知.text section的位偏移为0x00003f0,size为0x0000182。

②.strtab section是属于STRTAB类型的section,可以在文件中看到,它存着字符串,储存着符号的名字。位偏移为0x0000f58,size为0x0000214。

③.symtab section存放所有section中定义的符号名字,比如“data_items”,“start_loop”。 .symtab section是属于SYMTAB类型的section,它描述了.strtab中的符号在“内存”中对应的“内存地址”。 位偏移为0x0000910,size为0x0000648。

时间: 2024-11-09 02:11:29

实践四之实验报告的相关文章

数据结构与算法 第四次实验报告 图

数据结构与算法 第四次实验报告 姓名:许恺 学号:2014011329 班级:计算机14-1     中国石油大学(北京)计算机科学与技术系 1.图的定义,文件为"Graph.h" #ifndef GRAPH_H//定义头文件 #define GRAPH_H #include<string>//引入标准库中的头文件 using namespace std; const int MaxSize=12; struct ArcNode//定义边表结点 { int adjvex;/

20135239益西拉姆第四次实验报告

北京电子科技学院(BESTI) 实验报告 课程:JAVA第四次实验报告 班 级: 1352 姓 名:益西拉姆 学 号:20135239 成 绩: / 指导教师: 娄嘉鹏 实验日期: 2015.06.09 实验密级: / 预习程度: / 实验时间:15:00--18:00 仪器组次:39 必须/选修: 选修 实验序号:04 实验名称: 第四次实验 实验仪器: 名称 型号 数量 PC机 DELL 1 实验内容: 1:编写网络通信程序.(基于TCP) 2:对通信内容使用对称加密算法进行加密. 3:使用

2019春第四次实验报告

2019春第四次实验报告 一.实验项目名称 flappy bird 二.实验项目功能描述 用户通过空格键控制小鸟躲过障碍物 三.项目模块结构介绍 四.实现界面展示 五.代码托管链接 https://gitee.com/wenyizhang999/ZWY/blob/master/%E5%B0%8F%E9%B8%9F.cpp 六.实验总结 问题:没有声音,没有图片 解决方法:根据书上提供的材料下载图片,在根据要求的格式上传文件地址 总结:第五章内容和以前学的东西联系上了,文件的储存及使用,越到后期越

第四次实验报告:RIP路由协议的解析

第四次实验报告:RIP路由协议的解析 姓名:王璐璐 学号:201821121037 班级:计算1812 0 摘要 在此次实验中,通过对两个路由器之间的路由表的建立与更新情况的分析,解析RIP路由协议,以此了解网络层的工作原理. 1 实验目的 理解RIP路由表的建立与更新 感受RIP坏消息传得慢 2 实验内容 使用Packet Tracer,正确配置网络参数,使用命令查看和分析RIP路由信息. 建立网络拓扑结构 配置参数 分析RIP路由信息 3 实验报告 下面将在两台PC机之间连接两台路由器,配置

20182310第四次实验报告

20182310 <数据结构与面向对象程序设计>实验3实验报告 课程:<数据结构与面向对象程序设计> 班级:1823 姓名:周烔 学号:20182310 实验老师:王志强 实验日期:2019/9/30 选修/必修:必修 1.实验内容 (一)Java Socket编程 1.学习蓝墨云上教材<Java和Android编程>"第16章 输入/输出 "和"第22章 网络",学习JavaSocket编程 2.结对编程.结对伙伴A编写客户端S

《信息安全系统设计》第四次实验报告

实验报告:外设驱动设计 小组成员 :20145306张文锦,20145334赵文豪,20145331魏澍琛. 实验仪器:windows xp,arm开发板. 实验内容.步骤与体会 1. 进入/arm2410cl/exp/drivers/01_demo,使用vi 编辑器阅读理解源代码. 2. Makefile 中有两种编译方法,可以在本机上使用gcc:也可以使用交叉编译器进行编译. 如果编译的时候出现问题,需要是在/usr/src 下没有建立一个linux 连接,可以使用下面的命令:[[email

第四次实验报告

北京电子科技学院(BESTI) 实验报告 课程:信息安全系统设计基础   班级:1353 姓名:王剑桥.李雪琦           学号:20135316.20135309 成绩: 指导教师:娄嘉鹏  实验日期:2015.12.01 实验密级:   预习程度:  实验时间:15:30~18:00 仪器组次:  必修/选修:  实验序号:4 实验名称:外设驱动程序设计 实验目的与要求: 1.掌握实时系统应用和驱动程序的编写2.选择某个接口电路 实验仪器: 名称 型号 数量 嵌入式开发平台 UP-N

java第四次实验报告

课程:Java程序与设计     班级:1352 姓 名:池彬宁  小组成员: 20135212池彬宁 20135208贺邦 学号:20135212 成绩:             指导教师:娄嘉鹏       实验日期:2015.6.9 实验密级:          预习程度:         实验时间:15:30-18:00 仪器组次:          必修/选修:选修        实验序号:5 实验名称:Java网络编程及安全 实验目的与要求:结对编程,实现客户端和服务器之间数据的发送

南京邮电大学java第四次实验报告

实 验 报 告 ( 2017 / 2018学年 第2学期) 课程名称 JAVA语言程序设计 实验名称 Java集成开发环境的安装与使用. Java变量.表达式与控制结构 实验时间 2018 年 6 月 7 日 指导单位 计算机学院软件教学中心 指导教师 许棣华 学生姓名 王利国 班级学号 B160209 学院(系) 电子与光学工程学院,微电子学院 专    业 微电子科学与工程 实验名称 方法.数组和类 指导教师 许棣华 实验类型 上机 实验学时 2 实验时间 2017.6.7 一.    实验