搜索
查看
编辑修改
首页
UNITY
NODEJS
PYTHON
AI
GIT
PHP
GO
CEF3
JAVA
HTML
CSS
搜索
黑客灵魂
这个屌丝很懒,什么也没留下!
关注作者
热门标签
jquery
HTML
CSS
PHP
ASP
PYTHON
GO
AI
C
C++
C#
PHOTOSHOP
UNITY
iOS
android
vue
xml
爬虫
SEO
LINUX
WINDOWS
JAVA
MFC
CEF3
CAD
NODEJS
GIT
Pyppeteer
article
热门文章
1
yolov5_obb~模型到部署_yolov5-0bb
2
ES添加字段
3
实现 2.4 GHz ISM 频带中的良好共存_2.4gism
4
项目管理计划_通用模板_项目管理计划模板
5
交换机的端口安全
6
Python-Flair 实现英文命名实体识别(NER)_对英文进行命名实体识别工具和代码
7
Docker 安装gitLab_docker 安装 gitlab
8
(转)机器视觉会议以及牛人_机器视觉 帖子
9
人工智能对抗人工智能:利用人工智能来检测深度造假和网络钓鱼_开发出能有效识别和过滤ai深度造假内容的算法并不容易,
10
elf文件格式解析_elf格式解析
当前位置:
article
> 正文
linux逆向分析之ELF文件详解
作者:黑客灵魂 | 2024-07-19 03:55:16
赞
踩
linux逆向分析之elf文件详解
前言
首先如果大家遇到ELF二进制文件的逆向首先考虑的可能就是通过IDA进行静态逆向分析算法,那么我们首先就要了解ELF(Executable
and Linking Format)的文件格式。
ELF文件格式主要分为以下几类:
1. 可重定位文件(Relocatable File),这类文件包含了代码和数据,可以被用来链接成可执行文件或共享目标文件,静态链接库也可以归为这一类,如.o文件。
2. 可执行文件(Executable File),这类文件包含了直接执行的程序,如/bin/bash等。
3. 共享目标文件(Shared Object File),链接器可以使用这种文件跟其他的可重定位文件和共享目标文件链接,产生新的目标文件;动态链接器可以将几个共享目标文件与可执行文件结合,作为进程映像的一部分来运行,如glibc***.so。
4. 核心转储文件(Core Dump File),当进程意外终止时,系统可以将该进程的地址空间内容及终止时的一些其他信息转储到核心转储文件。
一.elf文件格式详解
以上是elf文件格式结构示意图
文件头
文件头的结构定义如下所示:
typedef struct {
unsigned char e_ident[16]; /* ELF魔数,ELF字长,字节序,ELF文件版本等 */
Elf32_Half e_type; /*ELF文件类型,REL, 可执行文件,共享目标文件等 */
Elf32_Half e_machine; /* ELF的CPU平台属性 */
Elf32_Word e_version; /* ELF版本号 */
Elf32_Addr e_entry; /* ELF程序的入口虚拟地址,REL一般没有入口地址为0 */
Elf32_Off e_phoff;
Elf32_Off e_shoff; /* 段表在文件中的偏移 */
Elf32_Word e_flags; /* 用于标识ELF文件平台相关的属性 */
Elf32_Half e_ehsize; /* 本文件头的长度 */
Elf32_Half e_phentsize;
Elf32_Half e_phnum;
Elf32_Half e_shentsize; /* 段表描述符的大小 */
Elf32_Half e_shnum; /* 段表描述符的数量 */
Elf32_Half e_shstrndx; /* 段表字符串表所在的段在段表中的下标 */
} Elf32_Ehdr;
利用readelf命令可以查看elf文件的头部信息,大家可以对照着看
结构的各个成员的含义如注释中所解释的。对ELF文件,有两个视图,一个是从装载运行角度的,另一个是从连接角度的。从装载运行角度,我们关注的是程序头表,由程序头表的指引把ELF文件加载进内存运行它。从连接的角度,我们关注节头表,由节头表的指引把各个节连接组装起来。e_type的值与这两个视图相联系,由它我们可以知道能够从哪个视图去解读。
如果e_type=1,表明它是重定位文件,可以从连接视图去解读它;
如果e_type=2,表明它是可执行文件,至少可以从装载运行视图去解读它;
如果e_type=3,表明它是共享动态库文件,同样可以至少从装载运行视图去解读它;
如果e_type=4,表明它是Coredump文件,可以从哪个视图去解读依赖于具体的实现。
如上图显示的是可执行文件那么我就要从装在运行视图去解读它
按照这两个视图,整个ELF文件的内容这样来组织:
首先是ELF文件头,也就是上面的Elf32_Ehdr结构。或者对64位的ELF文件,是Elf64_Ehdr结构。ELF文件头位于文件开始处,无论e_type的值是什么,它是必须有的。
其次是程序头表,对可执行文件(e_type=2)和动态库文件(e_type=3),它是必须有的。对重定位文件(e_type=1),程序头表的有无是可选的。例如用gcc的-c选项生成的.o文件,就没有程序头表。但无论如何,e_phoff和e_phnum、e_phentsize给出了ELF文件的程序头表信息。没有程序头表时它们的值为零。
然后就是就是节头表,对可执行文件和动态库文件,它的有无是可选的,对重定位文件,它是必须有的。
Program header table
每个程序头表的每个表项的结构为:
typedefstruct
{
Elf32_Wordp_type;/*段类型*/
Elf32_Offp_offset;/*在文件中的偏移*/
Elf32_Addrp_vaddr;/*执行时的虚地址*/
Elf32_Addrp_paddr;/*执行时的物理地址*/
Elf32_Wordp_filesz;/*在文件中的字节数*/
Elf32_Wordp_memsz;/*在内存中的字节数*/
Elf32_Wordp_flags;/*标志*/
Elf32_Wordp_align;/*字节对齐*/
}Elf32_Phdr;
那什么是所谓 sections 呢?可以说,sections 是在ELF文件里头,用以装载内容数据的最小容器。在ELF文件里面,每一个 sections 内都装载了性质属性都一样的内容,比方:
1) .text section 里装载了可执行代码;
2) .data section 里面装载了被初始化的数据;
3) .bss section 里面装载了未被初始化的数据;
4) 以 .rec 打头的 sections 里面装载了重定位条目;
5) .symtab 或者 .dynsym section 里面装载了符号信息;
6) .strtab 或者 .dynstr section 里面装载了字符串信息;
7) 其他还有为满足不同目的所设置的section,比方满足调试的目的、满足动态链接与加载的目的等等。
Section heafer table
每个节头表的每个表项的结构为:
typedefstruct
{
Elf32_Wordsh_name;/*节名索引*/
Elf32_Wordsh_type;/*节类型*/
Elf32_Wordsh_flags;/*加载和读写标志*/
Elf32_Addrsh_addr;/*执行时的虚地址*/
Elf32_Offsh_offset;/*在文件中的偏移*/
Elf32_Wordsh_size;/*字节大小*/
Elf32_Wordsh_link;/*与其他节的关联*/
Elf32_Wordsh_info;/*其他信息*/
Elf32_Wordsh_addralign;/*字节对齐*/
Elf32_Wordsh_entsize;/*如果由表项组成,每个表项的大小*/
}Elf32_Shdr;
这里我们来讨论一下连接视图中section与装载运行视图segments之间的关系。
链接器在链接可执行文件或动态库的过程中,它会把来自不同可重定位对象文件中的相同名称的 section 合并起来构成同名的 section。接着,它又会把带有相同属性(比方都是只读并可加载的)的 section 都合并成所谓 segments(段)。segments 作为链接器的输出,常被称为输出section。
一个单独的 segment 通常会包含几个不同的 sections,比方一个可被加载的、只读的segment 通常就会包括可执行代码section .text、只读的数据section .rodata以及给动态链接器使用的符号section .dymsym等等。section 是被链接器使用的,但是 segments 是被加载器所使用的。加载器会将所需要的 segment 加载到内存空间中运行。和用 sections header table 来指定一个可重定位文件中到底有哪些 sections 一样。在一个可执行文件或者动态库中, program header table中包含有 segments。
在当我们执行命令readelf -l读取程序表头的时候,结果显示,在可执行文件中,总共有8个 segments程序头。同时,该结果也很明白显示出了哪些 section 映射到哪一个 segment 当中去。比方在索引为2的那个segment 中,总共有18个 sections 映射进来,其中包括我们前面提到过的 .text section。注意这个segment 有两个标志: R 和 E。这个表示该segment是可读的,也可执行的。如果你看到标志中有W,那表示该segment是可写的。
上面类型为PHDR的segment,用来包含程序头表本身。类型为INTERP的segment只包含一个 section,那就是 .interp。在这个section中,包含了动态链接过程中所使用的解释器路径和名称。在Linux里面,这个解释器实际上就是 /lib/ ,这可以通过下面的 hexdump 看出来:[yihect@juliantec test_2]$ hexdump -s 0x134 -n 32 -C ./ElfCrackme2
$ hexdump -s 0x134 -n 32 -C ./ElfCrackMe2
00000134 2f 6c 69 62 2f 6c 64 2d 6c 69 6e 75 78 2e 73 6f |/lib/ld-linux.so|
00000144 2e 32 00 00 04 00 00 00 10 00 00 00 01 00 00 00 |.2..............|
00000154
关于ELF格式的知识就说到这,想了解更多的去了解下大牛的文章
点击打开链接
声明:
本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:
https://www.wpsshop.cn/w/黑客灵魂/article/detail/849279
推荐阅读
article
【最新】
Kali
linux
零基础
学习
教程
(超详细)
,
从下载
、
安装
到使用_
kali
linux
新手...
Kali
Linux是一个高级渗透测试和安全审计Linux发行版
,
其功能非常强大
,
能够进行信息取证
、
渗透测试
、
攻击WPA...
赞
踩
article
Kali
Linux2023
年
最新版
全网最细安装教程_
kali
linux
iso
...
Kali
Linux2023
年
最新版
全网最细安装教程_
kali
linux
iso
kali
linux
iso
...
赞
踩
article
KALI
Linux
最新超详细
安装
教程
_
kali
-
linux
...
接下来开始
安装
。
_
kali
-
linux
kali
-
linux
...
赞
踩
article
虚拟机
VM
ware
安装
Kali
Linux_vm
ware
kali
linux
新手
安装
教程...
一、创建新的
虚拟机
1.创建
虚拟机
2.导入镜像文件3.选择客户机系统,可能会提示错误不能用,不用管接着往下
安装
4.输入虚拟...
赞
踩
article
【
Kali
Linux
】高级
渗透
测试
实战篇...
>对于企业网络安全建设工作的质量保障,业界普遍遵循PDCA(计划(Plan)、实施(Do)、检查(Check)、处理(A...
赞
踩
article
渗透
测试工具
Kali
Linux
安装
与使用_
kali
-
linux
...
本文详细介绍了如何使用
Kali
Linux
进行渗透测试,包括
安装
步骤、虚拟机的配置、以及如何设置root密码。还涵盖了
安装
...
赞
踩
article
KALI
Linux
最新超详细
安装
教程_
kail2021
安装
...
可以说是最科学最系统的学习路线,大家跟着这个大的方向学习准没问题。我们在看视频学习的时候,不能光动眼动脑不动手,比较科学...
赞
踩
article
kali
linux
的
安装
教程_kai
linux
安装
...
本次所用工具如下:VMware
kali
linux
ISO1、如何下载
kali
linux
的
安装
包获取方式如下复制下方...
赞
踩
article
Linux
Ubuntu20.4版本 无
wifi
图标 手动安装
Realtek
8852be
无线网卡...
ubuntu20.4版本安装realtek
8852be
无线网卡
驱动
详细教程_rtl
8852be
网卡
驱动
rtl
8852be
...
赞
踩
article
Linux
系统下安装
Realtek
8852BE
网卡
驱动_
8852be
linux
...
联想小新Pro16无线
网卡
是realtek8852,可能是因为这个
网卡
不够成熟没有进
linux
内核。安装时需要联网,可以...
赞
踩
article
Linux
高级编程 -
信号量
semaphore
_
semaphore
arrays
...
信号量
semaphore
信号量
(
semaphore
)与之前介绍的管道,消息队列的等 IPC 的思想不同,
信号量
是一个计...
赞
踩
article
Linux
shell
脚本
编程
-
高级
篇 (
一
)_
shell
高级
编程
...
1. 创建函数可以将
shell
脚本
代码放进函数中封装起来,这样就能在
脚本
中的任何地方多次使用它了。1.1 基本的
脚本
...
赞
踩
article
linux
应用
编程
(持续更新)
_
linux
应用
编程
...
在嵌入式 Linux 系统中,我们编写的
应用
程序通常需要与硬件设备进行交互Tips:本篇将以正点原子 ALPHA/Min...
赞
踩
article
Linux
C
/
C
++ 实现
HTTP
请求器(T
C
P
客户端
)...
欢迎大家前来借阅
Linux
C
/
C
++ 实现
HTTP
请求器(T
C
P
客户端
) ...
赞
踩
article
[
Linux
]
基于
网络
编程
的
智能
机器
小伴侣_101280601丶...
文章目录1 项目描述2 项目需求3 搭建环境4 技术描述5 概要设计6 GIF表情切换7
机器
人
智能
回答8 城市天气查询...
赞
踩
article
ZYNQM
PS
OC
DMA
Linux
驱动移植,实现PL到
PS
的数据传输_mpsoc
linux
...
在ZYNQ M
PS
OC 3EG平台上移植
Linux
DMA
驱动实现PL到
PS
的大规模数据传输_mpsoc
linux
...
赞
踩
article
【
Linux
】
Linux
背景
历史...
主要介绍unix、linux、以及计算机的相关发展历程【
Linux
】
Linux
背景
历史 ...
赞
踩
article
【
Linux
】
僵尸
与
孤儿
&&
进程
等待
_
linux
僵尸
进程
...
【
Linux
】
僵尸
与
孤儿
&&
进程
等待
一,
僵尸
进程
1,
僵尸
进程
2,
僵尸
进程
的危害 二,
孤儿
进程
1,
孤儿
进程
...
赞
踩
article
【
Linux
】
虚拟机
安装
openEuler
24.03
X86_
64
...
1.1
openEuler
覆盖全场景的创新平台
openEuler
已支持 x86、Arm、SW
64
、RISC-V、Lo...
赞
踩
article
linux
允许
ssl
采用中强度
加密
_架构师:安全
协议
之
SSL
协议
详解...
SSL
协议
SSL
是用于安全传输数据的一种通信
协议
。它采用公钥
加密
技术、对称密钥
加密
技术等保护两个应用之间的信息传输的...
赞
踩
相关标签
网络
安全
网络安全
web安全
kali
kali linux
linux
sqlserver
ssl
chrome
人工智能
运维
服务器
测试工具
ubuntu
驱动开发