pwn学习day1——ELF文件结构

news2024/10/7 6:42:36

0x01 介绍

ELF(Executable and Linkable Format)是一种常见的可执行文件和共享库格式,其结构如下:

  1. ELF header:包含了 ELF 文件的基本属性信息
  2. Program header table:描述了程序在内存中的加载情况,包括可执行代码段、数据段等。
  3. Section header table:描述了 ELF 文件中所有节区的信息,如代码节区、数据节区等。
  4. 节区数据:包含了 ELF 文件中的实际数据,如代码、数据等。

ELF 文件的结构可以根据不同的操作系统和体系结构而有所差异。

0x02 ELF header

/usr/include/elf.h 或ELF规范里可以查到ELF头部的定义:

typedef struct
{
  unsigned char e_ident[EI_NIDENT];     /* 幻数及其他信息 */
  Elf64_Half    e_type;                 /* 对象文件类型 */
  Elf64_Half    e_machine;              /* 架构 */
  Elf64_Word    e_version;              /* 对象文件版本 */
  Elf64_Addr    e_entry;                /* 程序入口虚拟地址 */
  Elf64_Off     e_phoff;                /* 程序头表的偏移量 */
  Elf64_Off     e_shoff;                /* 节头表的偏移量 */
  Elf64_Word    e_flags;                /* 保存与文件相关的、特定于处理器的标志 */
  Elf64_Half    e_ehsize;               /* ELF头部的大小 */
  Elf64_Half    e_phentsize;            /* 程序头表的条目大小 */
  Elf64_Half    e_phnum;                /* 程序头表的条目数 */
  Elf64_Half    e_shentsize;            /* 节头表的条目大小 */
  Elf64_Half    e_shnum;                /* 节头表的条目数 */
  Elf64_Half    e_shstrndx;             /* 节头表中与节名称字符串相关联的条目的索引 */
} Elf64_Ehdr;

ELF header包含以下部分:

标识信息 (e_ident)

包括ELF文件类型、机器架构、版本等信息。

img

e_ident数组始终以4个字节的幻数为开头,以此来标识ELF文件,幻数由十六进制0x7f和ELF的ASCII码组成。

img

幻数后面的字节提供了有关ELF二进制文件类型规范的详细信息,后面那些字节的索引分别称为EI_CLASS、EI_DATA、EI_VERSION、EI_OSABI、EI_ABIVERSION以及EI_PAD等

  • EI_CLASS标识该二进制文件用于32位还是64位体系结构,前者设置为常量ELFCLASS32(1),后者设置为常量ELFCLASS64(2)
  • EI_DATA标识架构的字节序,也就是多字节值是大端序还是小端序,ELFDATA2LSB(1)表示小端序,ELFDATA2MSB(2)表示大端序
  • EI_VERSION标识ELF规范版本,现在只有一个值EV_CURRENT也就是1
  • EI_OSABI和EI_ABIVERSION标识关于应用程序二进制接口和操作系统的信息
  • EI_PAD包含多个字节,保留为了以后使用

readelf可以查看ELF头

img

e_type、e_machine和e_version

文件类型 (e_type)

描述ELF文件的类型,如可执行文件、共享库、目标文件等。

机器架构 (e_machine)

描述ELF文件所使用的机器架构,例如x86、ARM等。

版本信息 (e_version)

描述ELF头部和节头表的版本号。

入口地址 (e_entry)

描述可执行文件入口点的虚拟内存地址。

e_phoff和e_shoff

程序头表偏移量 (e_phoff)

描述程序头表在文件中的偏移量。

节头表偏移量 (e_shoff)

描述节头表在文件中的偏移量。

标志 (e_flags)

描述ELF文件的各种属性,如是否为可重定位文件。

ELF头部大小 (e_ehsize)

描述ELF头部的大小。

e_*entsize和e_*num

程序头表项大小 (e_phentsize)

描述每个程序头表项的大小。

程序头表项数量 (e_phnum)

描述程序头表中有多少个表项。

节头表项大小 (e_shentsize)

描述每个节头表项的大小。

节头表项数量 (e_shnum)

描述节头表中有多少个表项。

字符串表索引 (e_shstrndx)

描述字符串表在节头表中的索引。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/692314.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Gogs私服搭建

1. Gogs介绍 官网地址:https://gogs.io 文档地址:https://gogs.io/docs Gogs,全称为Go Git Service,是一个基于 Go 语言开发的Git服务。它提供了一个类似于GitHub的界面和功能,允许您在自己的服务器上搭建私有的Git仓库…

幂律智能联合智谱AI发布千亿参数级法律垂直大模型PowerLawGLM

前言 2023年是当之无愧的“大模型之年”,据瑞银集团的一份报告显示,ChatGPT推出仅仅两个月后,月活用户已经突破了1亿,成为史上用户增长速度最快的消费级应用程序。 在炙热的大模型赛道里,基于中文大模型的发布也是层…

二叉树OJ题:LeetCode--104.二叉树的最大深度

朋友们、伙计们,我们又见面了,本期来给大家解读一下LeetCode中第104道二叉树OJ题,如果看完之后对你有一定的启发,那么请留下你的三连,祝大家心想事成! 数据结构与算法专栏:数据结构与算法 个 人…

SAP从入门到放弃系列之工艺路线-子工序-Part2

文章目录 概述使用场景子工序内容1、 维护工序控制码2、维护子工序的工资类型3、作业标准值4、用户定义字段5、通过维护子工序的作业类型数据后,点击汇总标准值,工序的作业类型值可以通过子工序进行累计6、可以设置子工序是否带入生产订单 注意事项&…

selenium通过xpath定位text换行的元素

DOM元素(该元素是换行的,不能通过普通xpath定位): 可使用下面xpath定位该div //div[./text()/following-sibling::text()"点" and ./text()"5"] 解释一下就是:定位“子节点的text是[5] 且 子节点…

自然语言处理(概念)

1、 RNN模型简介 1.2传统RNN模型 2、LSTM模型 3、GRU模型 5、注意力机制 6、人名分类器 7 、BERT 8、Transformer 的结构是什么样子的? 各个子模块有什么作用? 8.1 Encoder模块 8.2 Decoder模块 8.3 Transformer 结构中的Decoder端具体输入是什么&#…

C# wpf 附加属性实现任意控件拖动调整大小

摘自这里 https://blog.csdn.net/u013113678/article/details/121719278 调试效果如下 using System; using System.Collections.Generic; using System.Diagnostics; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows; using Syst…

vue修改数据后页面不重新渲染

使用vue&#xff0c;遇到几次修改了对象的属性后&#xff0c;页面并不重新渲染 一、直接添加属性的问题 <template><div><p v-for"(value,key) in item" :key"key">{{ value }}</p><button click"addProperty">…

【Linux】在Ubuntu下部署nginx——nginx的负载均衡

介绍 这里是小编成长之路的历程&#xff0c;也是小编的学习之路。希望和各位大佬们一起成长&#xff01; 以下为小编最喜欢的两句话&#xff1a; 要有最朴素的生活和最遥远的梦想&#xff0c;即使明天天寒地冻&#xff0c;山高水远&#xff0c;路远马亡。 一个人为什么要努力&a…

vs中的一些编码问题

1. 基本概念 文件编码格式 首先vs中编辑&#xff0c;保存文件实际上也是将文件内容以一定的编码格式存储。对于中文字符串 string s "一"; 按不同的编码格式保存后&#xff0c;通过16进制文件查看器&#xff0c;可以看到中文的编码是能对应上的。 开放高级保存…

select和pselect的关于信号打断的实验

select和pslect的man手册 SELECT(2) Linux Programmers Manual SELECT(2)NAMEselect, pselect, FD_CLR, FD_ISSET, FD_SET, FD_ZERO - synchronous I/O …

【HDFS实战】HDFS联合(联邦)集群的发展史

HDFS联合集群的发展史 文章目录 HDFS联合集群的发展史HDFS原始架构方案一 HDFS Federation方案二 ViewFs方案三 HDFS Router-based Federation常用命令常用配置RPC serverConnection to the NamenodesAdmin serverHTTP ServerState StoreRoutingNamenode monitoring 版本相关is…

nestJS打印多层对象以及铺平金额类型

console.dir(ret, { depth: 3 }); 金额是Decimal类型不好显示 Logger.verbose(JSON.stringify(ret, null, 2)); 利用JSON.stringify参数格式化 null: 不对数据进行提取&#xff0c; 2&#xff1a;缩进两个空格&#xff0c; 效果是直接帮忙平铺金额对象

java.lang.IllegalStateException Unable to find a @SpringBootConfiguration代码报错

文章目录 一. 问题场景二. 报错原因三. 解决方案 一. 问题场景 使用idea基于springBoot的项目进行单元测试时&#xff0c;出现异常&#xff0c;如下所示&#xff1a; Test ignored.java.lang.IllegalStateException: Unable to find a SpringBootConfiguration, you need to …

【电源专题】案例:电池保护芯片有是否能向0V电池充电的功能的区别

本案例发生在实际的工作之中。案例是这样的,有些产品因为各种原因没有按规范将电池与设备断开,而是插入机器(存在1mA的静态功耗)中并存放在仓库里2年后发现产品无法开机使用,并且电池无法充电。更换新的电池后运行正常,所以认定为是电池的问题。 可是为什么电池无法充电呢…

学妹:怎样才能设计出优秀的测试用例?

这篇文章我们主要聊一下测试工程师最通用的也是最根本的技能&#xff0c;测试用例的设计能力。 测试用例 测试用例是通过使用在测试计划中确定的测试技术&#xff0c;对于已确定的测试条件进行逐步推敲&#xff0c;精炼而设计出来的重点说明如何具体操作产生何种结果的文档。…

(免费分享)基于springboot,vue高校就业系统

管理员&#xff1a;10086/123 学生&#xff1a;10087/123 企业&#xff1a;10070/123 辅导员&#xff1a;10090/123 项目描述 高校就业管理系统 学生 : 个人信息、查看企业岗位信息、简历信息管理、我的应聘 辅导员 : 学生信息管理、三方协议书审核、查看班级就业统计信息 企…

App启动流程分析(一)

一、App启动涉及到的三个进程 1、Launcher进程&#xff1a;负责接收用户点击屏幕的事件&#xff0c;它其实就是一个Activity&#xff0c;屏幕上的各种Icon就是这个Activity中的Button&#xff0c;当点击Icon时&#xff0c;会触发启动App的流程。 2、SystemServer进程&#xff…

新手小白学JAVA_IDEA修改编辑与控制台字体大小

很多小白在刚刚使用IDEA的时候还不是很熟练 本文主要给大家提供一些使用的小技巧&#xff0c;希望能帮助到你 1.改变编辑窗口字体大小 1.1 将字体大小设置为固定值 我们可以将编辑窗口的字体大小设置为固定值 1.2 动态改变字体的大小 我们还可以通过Ctrl鼠标滚轮改变编辑窗口…

微信小程序怎么制作自己的小程序

小程序制作是指通过工具或开发语言制作微信平台上的小型应用程序&#xff0c;具有轻量、易用、无需下载安装等优点。随着移动互联网的飞速发展&#xff0c;小程序已经成为了各种企业和个人展示自己、提供服务的重要手段之一。 小程序制作的好处 小程序可以提高品牌曝光度。在…